为什么导航属性在其类是私有时不会填充?

Key*_*red 4 c# entity-framework

我有这个简单的模型:

class Parent
{
   public int Id { get; set; }

   public virtual ICollection<Child> Children { get; set; }
}

class Child
{
   public int Id { get; set; }
   public int ParentId { get; set; }

   public virtual Parent Parent { get; set; }
}

class MyContext : DbContext
{
    public DbSet<Parent> Parents { get; set; }
    public DbSet<Child> Children { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Child>().HasRequired(s => s.Parent).WithMany(s => s.Children).HasForeignKey(s => s.ParentId);

        base.OnModelCreating(modelBuilder);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我使用MyContext如下,我得到空引用异常,因为child.Parent是null

var context = new MyContext();
var child = context.Children.First();
var parentId = child.Parent.Id;              // Parent == null
Run Code Online (Sandbox Code Playgroud)

要解决这个问题,我必须更改Parent和的Child类的访问修饰符public.

为什么需要这个?或者这只是一个错误?

oct*_*ccl 5

这不是一个错误,您正在使用名为Lazy Loading的实体框架功能,要使用它,您需要满足在此链接中可以找到的一些要求.其中一个要求是您的实体类必须是public.在该链接中,您将找到正确的解释为什么您应该满足这些要求,但总的来说,您的问题是因为EF无法从您的实体创建代理类,因为您不能使用延迟加载.您已经满足了延迟加载的主要要求,这是导航属性必须的virtual,但首先您必须满足EF创建代理类所需的要求.

作为一个额外的资源,我建议你看看这个msdn页面,在那里你可以找到使用EF加载相关实体的所有方法.

  • @NathanC不一定.想象一下私有嵌套类.如果其所有成员也是私有的,则包含类无法访问该类.但是,您可以在API的基础上将成员更改为内部甚至公共,以在包含的类中提供访问权限. (2认同)