0

我无法弄清楚为什么会这样。我为一家医疗公司准备了两张桌子(现在,完成后我会有两张以上)。主表被调用NPPR_Provider,它拥有一个外键NPPR_Header。这是一对一的关系,每个提供者只有一个标头。

现在我有一个简单的控制台应用程序来使用实体框架读取数据库,我打算稍后,一旦我知道我已经正确构建了模型,在 ASP.NET MVC 应用程序中使用它们。

我可以毫无问题地连接NPPR_Provider并从中获取数据。这工作正常。连接字符串和模型等都在工作。但是NPPR_Header不断出现null,我不知道为什么。

这两个表都存在于数据库(SQL Server)中,如下所示:

[AD].[NPPR_Provider]
[AD].[NPPR_Header]

NPPR_Provider 模型:

namespace Company.Name.Application.Models
{
    [Table("NPPR_Provider", Schema ="AD")]
    public class NPPR_Provider
    {
        [Key]
        public int NPPRProvId { get; set; }

        public int NPPRFileId { get; set; }
        public virtual NPPR_Header NPPR_Header { get; set; }

        public string First { get; set; }
        public string Middle { get; set; }
        //... and more column names I won't bore you with
    }

    public class NPPR_ProviderContext : DbContext
    {
        private string _state;
        public NPPR_ProviderContext(string state)
        {
            _state = state.ToUpper();
        }

        public DbSet<NPPR_Provider> NPPR_Provider { get; set; }
        public DbSet<NPPR_Header> NPPR_Header { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(
                $"server=DEVSERVER;database=DataBaseName_{_state};trusted_connection=true;");
        }

    }
}

NPPR_Header

namespace Company.Name.Application.Models
{
    [Table("NPPR_Header", Schema = "AD")]
    public class NPPR_Header
    {
        [Key]
        public int NPPRFileId { get; set; }
        public string FileName { get; set; }

    }
}

以及使用它的代码,在class SQLUtilities

public static string test()
{
    using (var db = new NPPR_ProviderContext("ks"))
    {
        if (db.Database.CanConnect())
        {
            var npprFile = db.NPPR_Provider
                .Where(provider => provider.First == "Bob");
            int count = 0;
            foreach(var result in npprFile)
            {
                Console.WriteLine(result.NPPR_Header.FileName);
                count++;
            }
            return $"Complete, {count} records found";
        }
        else
        {
            return "Failed to connect";
        }
    }
}

上面我试图模拟我的应用程序需要执行的部分操作,通过提供程序名称查询数据库并获取我需要提供给用户的特定 JSON 文件的文件名。

控制台应用程序(一旦我知道我的模型可以工作,我打算将其丢弃):

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(SqlUtilities.test());
            Console.ReadLine();
        }
    }
}

现在有了数据,因为 SQL 中该test()方法的逻辑等价物是:

SELECT h.FileName FROM AD.NPPR_Provider p 
    INNER JOIN AD.NPPR_Header h 
    ON p.NPPRFileId = h.NPPRFileId 
    WHERE p.First = 'Bob';

它为我提供了 60 多条记录,其中包含我正在寻找的所有文件名。外键和主键在表中就位 C# 代码给了我相同数量的记录,但它们都是空的。代码崩溃(如果我尝试像上面那样访问 FileName 属性)并明确指出错误

Company.Name.Application.Models.NPPR_Provider.NPPR_Header.**get** returned null.

我不知道为什么 NPPR_Header 为空。连接字符串有效,我可以从 NPPR_Provider 获取信息。 NPPR_Provider不为空。外键和 NPPR_Header 属性位于 NPPR_Provider 上。它们也存在于数据库中。

这可能是非常愚蠢的事情,我是 Entity Framework 的新手,我已经阅读了多篇文章和 Stack Overflow 问题,但我错过了一些东西。

4

1 回答 1

0

我认为您缺少Include方法。

如果你想加载子实体,你需要像下面这样使用它:

context.Customers
        .Include(c => c.Invoices)    
        .ToList();    

在您的情况下,您需要使用

var npprFile = db.NPPR_Provider
               .Include(provider.NPPR_Header)
               .Where(provider => provider.First == "Bob");
于 2019-09-13T18:33:26.570 回答