2012-06-13 37 views
3

如果我有3個表:實體框架4負載,包括結合

表1,表2,表3

和表3有一個FK的表2,其中有一個FK,以表1

然後我打開我的對象是這樣的:

using(Entities entities = new Entities() 
{ 
    Table1 table = entities.Table1.FirstOrDefault(); 
    table.Table2.Load(); 
} 

如何關閉LazyLoading,我怎樣才能將table3切換到table2。

我知道我可以在FirstOrDefault語句中使用Include,但它會產生太大的連接。

ANSWER

using(Entities entities = new Entities()) 
{ 
    Table1 table = entities.Table1.FirstOrDefault(); 
    var table2 = table.Table2.CreateSourceQuery().Include("Table3") 
     .Execute(MergeOption.AppendOnly); 
    table.Table2.Attach(table2); 
} 
+1

定義「太大連接」。使用include應該與使用Load不同,除了在單個查詢中發生。 –

+0

空載將運行一個單獨的查詢來獲取外部表記錄。問題是Table3還有5個需要加載的外表。保存在記事本中的查詢大約100kb。我寧願有一個單獨的查詢外部記錄(Load就是這樣做的)。 – YesMan85

回答

3

我怎樣才能熱切負載表3至表2,因爲惰性加載是 關閉。

你可以試試:

using(Entities entities = new Entities()) 
{ 
    Table1 table = entities.Table1.FirstOrDefault(); 
    table.Table2.CreateSourceQuery().Include("Table3") 
     .Execute(MergeOption.AppendOnly); 
} 

我假設你正在使用從EntityObject,不波蘇斯派生實體,即table.Table2EntityCollection<T>EntityReference<T>。我不是100%確定上述代碼是否按預期工作。

+0

將此標記爲答案,並將其添加到我的問題中,因爲您忘記了一件重要的作品:將表2重新附加到表格上:) – YesMan85

+0

@ Rogier21:這正是我不確定'Execute'是否會執行該操作的問題。 EF> = 4.1有一個名爲'Load()'的'IQueryable'的擴展方法,並且'DbContext'與上面的顯式加載相對應,在末尾使用'Load'而不是'Execute'。 'Load'是一個'void'方法,並自動填充子集合。但是,似乎在EF 4.0中不存在這樣的「Load」,而且您必須手動附加由「Execute」返回的結果。謝謝你的提示! (+1,對於這個問題:)) – Slauma