2009-04-14 40 views
3

我有一個簡單的databasescheme:用戶,帳戶。用戶與帳戶有一對多的關係。Ado.Net實體:對象不顯示鏈接的成員(外鍵)

我已經生成了ado.net實體數據模型,我可以創建用戶和帳戶,甚至可以將它們鏈接在一起。在數據庫中,account.user_id被正確填充,所以理論上我應該能夠通過實體訪問C#中的User.Account.ToList()。

但是,當我嘗試訪問User.Account.ToList()時,我得到零結果。

User user = db.User.First(U => U.id == 1); 
List<Account> accounts = user.Account.ToList(); ##count = 0... 

當我前面的代碼之前添加以下代碼突然給了我正確的計數2

Account account1 = db.Account.First(A => A.id == 1); 
Account account2 = db.Account.First(A => A.id == 2); 
User user = db.User.First(U => U.id == 1); 
List<Account> accounts = user.Account.ToList(); ##count = 2...?? 

缺少什麼我在這裏?

回答

2

您應該使用ObjectQuery.Include方法。你的方法也可以工作,但會產生額外的查詢。

在你的榜樣,你會得到

User user = db.User.Include("Account").First(u => u.id == 1); 

你必須弄清楚串"Account"是否正確。通常它應該以MyEntities之類的前綴。這取決於你的實體的命名空間,但有一點試驗和錯誤,你應該能夠弄清楚。

1

我猜我的知識有點小框架。 :)

您需要先顯式加載相關帳戶。

user.Account.Load(); 

現在它顯示正確。

2

是的,這是開始使用實體框架時的一個常見問題 - 父子關係都沒有延遲加載,因此您必須顯式加載它們。如果要在類/方法之間共享對象上下文,則可能需要檢查是否已加載關係:

例如,

if(!user.Account.IsLoaded) 
     user.Account.Load(); 

可以使這更容易用一個簡單的擴展方法:使用這使得您的負載通話短又

public static class EntityExtensions 
{ 
    public static void EnsureLoaded(this RelatedEnd relatedEnd) 
    { 
     if (!relatedEnd.IsLoaded) 
      relatedEnd.Load(); 
    } 
} 

user.Account.EnsureLoaded(); 

而且,因爲它採用的是RelatedEnd,這是通用於實體框架中的父子關係,您也可以將其用於父引用關係 - 例如

account.UserReference.EnsureLoaded(); 

由於rwwilden說,如果你總是要加載在這種情況下,父親的子對象,你可能需要使用一個包含撥打電話更加高效和避免額外的往返到數據庫。

+0

非常感謝您的回答。 Linq to Sql和Nhibernate後,我很驚訝,因爲我沒有加載孩子關係調試 – 2009-08-20 21:53:19

相關問題