在实体框架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??请帮我理解。

感谢

在实体框架4中填充外键对象

这是由于延迟加载造成的。当您调用Context.ContextInstance.Personnels.ToList();时,它将获取所有人员的,但Title在实例化之前不会获取,所以使其成为虚拟的以获取它。

或者,您可以通过禁用延迟加载

public MyEntitiesContext() : base("name=MyEntitiesContext", "MyEntitiesContext") {
     this.Configuration.LazyLoadingEnabled = false;
}

这样做将从上下文中获取所有相关数据。当您指定要查询的属性时,使用"include"是按需加载。

Virtual关键字允许实体框架运行时为实体类及其属性创建动态代理,从而支持延迟加载。如果没有虚拟,将不支持延迟加载,并且集合属性为null。

如果JobTitle属性定义为virtual,则不需要使用include。

这里解释得很好:实体框架4.1虚拟属性