2013-01-03 61 views
-1

當上下文創建時間設置預先加載,在EF使用Include的許多例子出現這樣的(給出了兩個相關的實體稱爲資源和變更):實體框架包含是否需要.First()?

var context = new MyContext(); 
context.Resources.Include(x => x.Variations).First(); 
return context; 

但別人不:

context.Resources.Include(x => x.Variations);

只有前者似乎適用於我,但我找不到任何解釋爲什麼需要它?

+0

你在結果中需要什麼實體? – lante

+0

已更新提及渴望加載 –

回答

2
context.Resources.Include(x => x.Variations); 

構建一個查詢,當執行時,加載所有資源及其變化。然後,您放棄該查詢。永遠不要執行查詢意味着你沒有得到查詢的結果,並且你沒有得到執行該查詢的副作用。

你可以做一些與資源:

foreach (var resource in context.Resources.Include(x => x.Variations)) 
{ 
    /* ... */ 
} 

,或者,如果你只是想有對象出現在你的情況下,

using System.Data.Entity; 

context.Resources.Include(x => x.Variations).Load(); 

還有就是,因爲據我所知,沒有辦法設置上下文,以便在構建查詢時始終隱式執行.Include的效果。您需要將其包含在每個查詢中。

0

當你

context.Resources.Include(x => x.Variations); 

你獲得資源對象的列表。使用.First()將爲您提供該資源列表中的第一個資源。

0

總之:它被稱爲不同實體的效果加載的。在實體框架中,有三個層次:惰性,顯式和熱切加載方法,您可以從中選擇,並在代碼中相應地使用。

換句話說,實體框架支持三種方法來加載相關實體:

  • 急切裝載
  • 遲緩裝載
  • 顯式加載

上面顯示這兩種三種技術中討論本文中的細節 - Loading Related Entities

低於你的代碼片段使用急切地加載:

context.Resources.Include(x => x.Variations).First(); 

只有前者的似乎爲我工作,但我找不到任何解釋爲什麼它的需要?

後來的代碼片段(在一個沒有.First())不爲你工作,因爲可以使用預先加載(見急切裝載上述相關實體)或Load方法實現相關實體的加載:

context.Resources.Include(x => x.Variations).Load(); 
// or a sample like 
// Load the posts related to a given blog 
context.Entry(blog).Collection(p => p.Posts).Load(); 

編輯:如果由於某種原因你感到困惑與延遲加載,那麼您可以使用該選項關閉它在上下文

public MyContext() 
    { 
     this.Configuration.LazyLoadingEnabled = false; 
    } 
+0

不,這不是延遲加載引用的內容。延遲加載指的是通過訪問屬性來加載'Variations',如'var resource = context.Resources.Single();/*或其他*/foreach(resource.Variations中的var變體){}'這個問題肯定使用了急切的加載。 – hvd

+0

@ hvd,我在我的答案中進行了修改,因爲問題主體已經從我第一次發佈我的答案時發生了變化。因此,我的答案中的代碼示例是指熱切加載。 –

+0

我已經刪除了我的downvote,因爲你的答案不再不正確,但IMO仍然沒有回答這個問題。不工作的代碼片段*也會嘗試使用急切的加載。 – hvd