假设:
public SomeEntity Read(int primaryKey)
{
SomeEntity myEntity;
using (var context = new MyEntities2())
{
context.Configuration.LazyLoadingEnabled = false;//This line is wacky
myEntity = context.SomeEntities.SingleOrDefault(ct => ct.PrimaryKey == primaryKey);
if (myEntity == null)
return myEntity;
//Force eager Load...
var bypassDeferredExecution = myEntity.RelatedTable1.ToList();
var bypassDeferredExecution2 = myEntity.RelatedTable2.ToList();
}
return myEntity;
}
如果我设置了LazyLoadingEnabled = false
,那么 myEntity.RelatedTable1.Count == 0 。
保留默认值LazyLoadingEnabled = true
,然后保留myEntity.RelatedTable1.Count == 2.
我的理解是,Lazy Loading和Eager Loading是极端的对立面。我迫不及待加载。无论我是否使用延迟加载,我希望我的相关表(交叉引用表)有2个结果。所以在我看来,这些结果毫无意义。
为什么延迟加载会影响我的结果?
答案 0 :(得分:5)
您必须使用Include
急切加载相关实体:
myEntity = context.SomeEntities
.Include("RelatedTable1")
.Include("RelatedTable2")
.SingleOrDefault(ct => ct.PrimaryKey == primaryKey);
将延迟加载设置为false不会导致它自动发生。
答案 1 :(得分:1)
如果您正在使用延迟加载,则需要进行LINQ to Entities Include
方法调用以识别(外键控)表以急切加载。
答案 2 :(得分:0)
导航属性不是查询,它是可枚举的集合。您有两种方法可以从DB获取它:
- 延迟加载(将在第一次访问属性时加载)
- 预先加载(如果添加Include({propertyName}
方法
因此,如果您关闭延迟加载并且不向查询添加Include
方法,则每个导航属性都将为空(空集合或单个实体的空值)
以下代码适用于您的情况:
myEntity = context.SomeEntities
.Include("RelatedTable1")
.Include("RelatedTable2")
.SingleOrDefault(ct => ct.PrimaryKey == primaryKey);
答案 3 :(得分:0)
延迟加载会延迟对象的初始化,直到需要它为止。在这种情况下,它将自动执行对DB的查询以加载所请求的对象。
Eager loading加载一组特定的相关对象以及查询中明确请求的对象。
因此,为了使用Eager Loading,您需要指定要加载的相关对象。
在EF中,您可以使用Include
中的ObjectQuery
方法实现此目的。
context.Entity.Include("RelatedObject");