【问题标题】:Related Table in Entity Framework coming up as null实体框架中的相关表显示为空
【发布时间】:2019-09-13 18:26:41
【问题描述】:

我不知道为什么会这样。我为一家医疗公司准备了两张桌子(现在,完成后我会有两张以上)。主表称为NPPR_Provider,它拥有NPPR_Header 的外键。这是一对一的关系,每个 Provider 只有一个 Header。

现在我有一个简单的控制台应用程序来使用 Entity Framework 读取数据库,我打算稍后,一旦我知道我已经正确构建了模型,就可以在 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 问题,但我错过了一些东西。

【问题讨论】:

    标签: asp.net sql-server entity-framework


    【解决方案1】:

    我认为您缺少Include 方法。

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

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

    在你的情况下你需要使用

    var npprFile = db.NPPR_Provider
                   .Include(provider.NPPR_Header)
                   .Where(provider => provider.First == "Bob");
    

    【讨论】:

    • 我知道这很愚蠢!谢谢,就是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    相关资源
    最近更新 更多