2010-06-14 110 views
1

我需要在EF版本1中創建實體數據模型,因爲我的虛擬主機還沒有Framework 4.0。下面只是一個簡單的例子來展示這個問題。實體框架中的外鍵關係v.1

我有3個表,一個用戶表,另一個網頁表和一個帶訪問表。前兩個表中的每個表都與訪問表具有一對多關係(基本上,它可以作爲多對多關係,只有訪問表具有其主鍵和額外字段)

使用4.0這個版本可以工作,但它不適用於v.1。 「訪問」的計數爲0,所以測試字符串返回「」...爲什麼,我將如何訪問第1版中的外鍵關係?

UsersEntities context = new UsersEntities(); 
var users = context.Users; 
string result = ""; 
foreach (var user in users) 
{ 
    foreach (var visit in user.Visits) 
    { 
     result += visit.Webpage.Url + "\n"; 
    } 
} 

因此,foreach循環遍歷用戶,它可以正常工作,但內部循環從不輸入,因爲沒有訪問返回。再次,在Framework 4.0中,它使用相同的數據庫工作正常。

那麼,怎麼了?

回答

2

只需將您的代碼改成這樣:

UsersEntities context = new UsersEntities(); 
var users = context.Users.Include("Visits"); 
string result = ""; 
foreach (var user in users) 
{ 
    foreach (var visit in user.Visits) 
    { 
     result += visit.Webpage.Url + "\n"; 
    } 
} 

通知的包括(...)告訴EF急切地加載每個用戶的訪問。

有了它,它應該工作。

其實如果網頁是導航也一樣,你可能需要:

Include("Visits.Webpage"); 

希望這個作品

+0

好棒!它工作得很好,謝謝! 只有幾個問題:爲什麼這是必要的?在Linq to Sql中沒有必要,而不是在v.4.0中,所以這是一個在4.0中得到糾正的缺點,或者這個「Include」的目的是什麼? 此外,當像這樣導航數據模型時,需要遍歷許多步驟(「點」)以獲得所需的對象。我正在考慮最少知識的原則,或者說你應該避免這一點的「德米特法則」。這是一個問題嗎?否則我不知道該怎麼做......(我問,因爲我試圖更多地瞭解設計原理)。 – Anders 2010-06-15 08:07:26

+0

在L2S中,當您訪問導航時,它會默默加載 - 也稱爲lazyloading。 至於德米特法則,我還沒有看到一個ORM,允許您摺疊導航以避免這種違規行爲。 即x.YZ而不是x.Y.Z – 2010-06-16 00:37:08

+0

當您事先知道需要某些數據時,您可以使用Include - lazyloading - 當您拉回大量結果時可能很有用,並且可能只需要一些結果中的相關項目。即預先將所有數據拉回是浪費。 – 2010-06-16 00:38:27