我第一次使用EntityFramework,也许这个问题很简单......我已经使用了代码第一种方法..我有一个类人员,看起来像这样:
public class Personnel
{
public string Id { set; get; }
public int Code { set; get; }
public string Name { set; get; }
public int Type { set; get; }
public JobTitle Title { set; get; }
}
和JobTitle类:
public class JobTitle
{
public string Id { set; get; }
public int Number { set; get; }
public string Title { set; get; }
public List<Personnel> Personnels { set; get; }
}
其中Personnel Class中的最后一个属性当然是人员表中的外键。我的问题是当我想使用lambda表达式从DB检索所有人员(或人员)时,外键对象为空。 .λ表达式如下:
Context.ContextInstance.Personnels.ToList();
如果我将表达式更改为this,则外键对象不再为null。
Context.ContextInstance.Personnels.Include("Title").ToList();
是正确的方法??有没有更好的方法??我想EF会自动明白!!!! ..如果有超过1 FK那么我必须使用Include for all他们??请帮我理解。
由于
答案 0 :(得分:6)
如果您的JobTitle
属性定义为virtual
,则无需使用包含。
答案 1 :(得分:6)
这是由于延迟加载。当你调用Context.ContextInstance.Personnels.ToList();
时,这将获取所有人员,但是在获得实例之前不会获取Title,所以让它虚拟来获取它。
或者,您可以通过
禁用延迟加载public MyEntitiesContext() : base("name=MyEntitiesContext", "MyEntitiesContext") {
this.Configuration.LazyLoadingEnabled = false;
}
执行此操作将从上下文获取所有相关数据。当您指定要查询的属性时,使用“include”按需加载。
虚拟关键字允许实体框架运行时为您的实体类及其属性创建动态代理,并通过该支持延迟加载。如果没有虚拟,则不支持延迟加载,并且您在集合属性上获得null。