2013-08-27 82 views
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個結果,不管我是否使用延遲加載。所以在我看來,這些結果毫無意義。

爲什麼延遲加載會影響我的結果?

回答

5

你必須使用Include熱切的負載相關實體:

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

設置延遲加載爲false將不會導致其自動發生。

+0

如果只是執行查詢的時間問題,那麼爲什麼調用ToList()無法糾正問題? 'myEntity.RelatedTable1.ToList()'我期望LINQ to SQL將我的結果從0結果更新爲2結果。這種情況不會發生的原因目前還不清楚。 –

+0

因爲當你將*延遲加載*設置爲'false'時,EF不會再發送任何查詢,除非你使用'Context'實例明確請求一個查詢。 – MarcinJuraszek

1

如果您使用延遲加載,那麼需要有一個LINQ to Entities Include方法調用來標識要加載的(外鍵)表。

0

導航屬性不是查詢,它是可枚舉的集合。你有2種方式從數據庫得到它: - 延遲加載(將在第一次訪問屬性加載) - 預先加載(將執行主查詢後,如果您添加Include({propertyName}方法

因此被載入,如果你關閉延遲加載和不添加Include方法來查詢每個導航屬性是空的(空的集合或單一實體空值)

下面的代碼應該工作你的情況:

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

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

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

因此,爲了使用Eager加載,您需要指定要加載的相關對象。

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

context.Entity.Include("RelatedObject"); 
相關問題