为什么禁用延迟加载会导致相关表没有结果?

时间:2013-08-27 17:22:55

标签: c# entity-framework-4

假设:

        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个结果。所以在我看来,这些结果毫无意义。

为什么延迟加载会影响我的结果?

4 个答案:

答案 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");