在实体框架4中填充外键对象
本文关键字:对象 填充 实体 框架 | 更新日期: 2023-09-27 18:25:32
我是第一次使用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; }
}
以及职务类别:
public class JobTitle
{
public string Id { set; get; }
public int Number { set; get; }
public string Title { set; get; }
public List<Personnel> Personnels { set; get; }
}
人事类中的最后一个属性当然是人事表中的外键。。我的问题是,当我想使用lambda表达式从DB中检索所有人员(或人员)时。。外键对象为null。。lambda表达式如下所示:
Context.ContextInstance.Personnels.ToList();
如果我把表达式改成这个,外键对象就不再为null了。
Context.ContextInstance.Personnels.Include("Title").ToList();
这是正确的方式吗??。。有更好的方法吗??。。我想EF会自动理解的!!!!。。如果有超过1个FK,那么我必须对所有FK使用Include??请帮我理解。
感谢
这是由于延迟加载造成的。当您调用Context.ContextInstance.Personnels.ToList();
时,它将获取所有人员的,但Title在实例化之前不会获取,所以使其成为虚拟的以获取它。
或者,您可以通过禁用延迟加载
public MyEntitiesContext() : base("name=MyEntitiesContext", "MyEntitiesContext") {
this.Configuration.LazyLoadingEnabled = false;
}
这样做将从上下文中获取所有相关数据。当您指定要查询的属性时,使用"include"是按需加载。
Virtual关键字允许实体框架运行时为实体类及其属性创建动态代理,从而支持延迟加载。如果没有虚拟,将不支持延迟加载,并且集合属性为null。
如果JobTitle
属性定义为virtual
,则不需要使用include。
这里解释得很好:实体框架4.1虚拟属性