8

我第一次使用 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; }

}

人员类中的最后一个属性当然是人员表中的外键..我的问题是当我想使用 lambda 表达式从数据库中检索所有人员(或人员)时..外键对象为空..lambda表达式如下:

Context.ContextInstance.Personnels.ToList();

如果我将表达式更改为此外键对象不再为空。

 Context.ContextInstance.Personnels.Include("Title").ToList();

这是正确的方法吗??..有更好的方法吗??..我认为EF会自动理解!!!!..如果有超过1个FK,那么我必须对所有这些都使用Include? ? 请帮我理解。

谢谢

4

2 回答 2

6

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

这里解释得很好:Entity Framework 4.1 Virtual Properties

于 2013-07-31T06:09:51.310 回答
6

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

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

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

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

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

于 2013-07-31T06:12:12.160 回答