我有一些简单的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没有设置这个导航属性? 什么会导致实体框架在现有数据上保存一个未加载(但可延迟加载)的引用?
对于集合来说工作得很好,因为在这种情况下你只是实例化了一个空集合,而不是任何引用的对象。但是对于引用属性,最好避免这样做。