EF4.1 包含不起作用,如果在构造函数中实例化非列表关联属性



我有一些简单的Code First类与多对一的关系。如果我检索一个Child并使用Include来检索School,那么如果我注释掉School = new School()行,它就会正常工作,但是有了它,School类就不会被填充。我假设这是预期的行为(有人可以确认吗?),但它抓住了我,特别是考虑到对集合属性做同样的工作很好。

public class Child
{
    public Child()
    {
        School = new School();    
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public int SchoolId { get; set; }
    public School School { get; set; }        
}
public class School
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Child> Children { get; set; }        
}
public class TestContext : DbContext
{
    public TestContext(string connectionString)
        : base(connectionString)
    {
    }
    public DbSet<Child> Children { get; set; }        
}
public class Test
{
    public Test()
    {
        var context = new TestContext("...connectionstring...");
        var child = context.Children.Include(x => x.School).Where(x => x.Id == 1).SingleOrDefault();
        Debug.Assert(child.School.Id != 0, "School is null");
    }
}

是的,在默认构造中实例化引用导航属性会导致问题:

  • EF 4.1代码优先:为什么EF没有设置这个导航属性?
  • 什么会导致实体框架在现有数据上保存一个未加载(但可延迟加载)的引用?

对于集合来说工作得很好,因为在这种情况下你只是实例化了一个空集合,而不是任何引用的对象。但是对于引用属性,最好避免这样做。

最新更新