我第一次使用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中检索所有人员(或人员)时…外键对象为空… lambda表达式如下:
Context.ContextInstance.Personnels.ToList();
如果我将表达式更改为此,则外键对象不再为null.
Context.ContextInstance.Personnels.Include("Title").ToList();
它是正确的方法??有没有更好的方法??我认为EF会自动了解!!!! ..如果有超过1 FK那么我必须使用Include为所有这些? ?请帮我理解.
谢谢
解决方法
这是由于延迟加载.当你调用Context.ContextInstance.Personnels.ToList();这将获取所有人员,但Title不会获取,直到它获得实例,所以让它虚拟得到它.
或者,您可以通过禁用延迟加载
public MyEntitiesContext() : base("name=MyEntitiesContext","MyEntitiesContext") { this.Configuration.LazyLoadingEnabled = false; }
这样做将从上下文中获取所有相关数据.当您指定要查询的属性时,使用“include”按需加载.
虚拟关键字允许实体框架运行时为您的实体类及其属性创建动态代理,并通过该支持延迟加载.如果没有虚拟,则不支持延迟加载,并且您在集合属性上获得null.