2

鉴于:

        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。

我的理解是延迟加载和急切加载是截然相反的。我强迫急切加载。无论我是否使用延迟加载,我都希望我的相关表(交叉引用表)有 2 个结果。所以在我看来,这些结果毫无意义。

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

4

4 回答 4

5

您必须使用Include热切加载相关实体:

myEntity = context.SomeEntities
                  .Include("RelatedTable1")
                  .Include("RelatedTable2")
                  .SingleOrDefault(ct => ct.PrimaryKey == primaryKey);

延迟加载设置为 false 不会导致它自动发生。

于 2013-08-27T17:25:32.423 回答
1

如果您使用延迟加载,则需要Include调用 LINQ to Entities 方法来识别要急切加载的(外键)表。

于 2013-08-27T17:26:06.623 回答
0

导航属性不是查询,它是可枚举的集合。您有 2 种方法从 DB 中获取它: - 延迟加载(将在第一次访问属性时加载) - 急切加载(如果添加Include({propertyName}方法,将在执行主查询后加载

因此,如果您关闭延迟加载并且不Include向查询添加方法,则每个导航属性将为空(空集合或单个实体的空值)

以下代码应该适用于您的情况:

myEntity = context.SomeEntities
.Include("RelatedTable1")
.Include("RelatedTable2")
.SingleOrDefault(ct => ct.PrimaryKey == primaryKey);
于 2013-08-27T17:31:04.710 回答
0

延迟加载延迟对象的初始化,直到需要它。在这种情况下,它将自动执行对数据库的查询以加载请求的对象。

急切加载会加载一组特定的相关对象以及查询中明确请求的对象。

因此,为了使用 Eager Loading,您需要指定要加载的相关对象。

在 EF 中,您可以Include使用ObjectQuery.

context.Entity.Include("RelatedObject");
于 2013-08-27T17:31:21.423 回答