[英]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 = false
則myEntity.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.