簡體   English   中英

為什么禁用延遲加載會導致相關表沒有結果?

[英]Why does disabling lazy loading cause related tables to have no results?

鑒於:

        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設置LazyLoadingEnabled = falsemyEntity.RelatedTable1.Count == 0
保留默認值LazyLoadingEnabled = true然后保留myEntity.RelatedTable1.Count == 2。

我的理解是,懶加載和急加載是相反的。 我強迫渴望加載。 無論我是否使用延遲加載,我都希望我的相關表(交叉引用表)有2個結果。 因此,在我看來,這些結果毫無意義。

為什么延遲加載會影響我的結果?

您必須使用Include來熱切加載相關實體:

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

延遲加載設置為false不會導致它自動發生。

如果您使用的是延遲加載,則需要有一個LINQ to Entities Include方法調用,以標識要緊急加載的(外鍵)表。

導航屬性不是查詢,而是可枚舉的集合。 有兩種方法可以從數據庫獲取它:-延遲加載(將在第一次訪問屬性時加載)-急切加載(如果添加Include({propertyName}方法,將在執行主查詢后加載)

因此,如果您關閉了延遲加載並且不向查詢添加Include方法,則每個導航屬性將為空(單個實體為空集合或null值)

以下代碼適用於您的情況:

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

延遲加載推遲了對象的初始化,直到需要它為止。 在這種情況下,它將自動對數據庫執行查詢以加載請求的對象。

渴望加載會加載一組特定的相關對象以及查詢中顯式請求的對象。

因此,為了使用急切加載,您需要指定要加載的相關對象。

在EF中,您可以使用ObjectQuery Include方法來實現。

context.Entity.Include("RelatedObject");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM