2012-04-02 63 views
0

我有一個關於實體框架(EF4)中的外鍵的問題。如何使用實體框架獲取嵌套的外鍵屬性

可以說我有類:分別

public class E1 
{ 
    public int Id{get;set;} 
    Public string name{get;set;} 
} 
public class E2 
{ 
    [ForeignKey("e1")] 
    public int E1Id{get;set;} 

    [ForeignKey("E1Id")] 
    public E1 e1{get;set;} 

} 
public class E3 
{ 
    [ForeignKey("e2")] 
    public int E2Id{get;set;} 

    [ForeignKey("E2Id")] 
    public E2 e2{get;set;} 
} 
public class E4 
{ 
} 

,我想我想通過的E3對象(內部調用E2)調用訪問的class E4class E1屬性以及E2調用E1爲上面顯示,但當我嘗試訪問E1的屬性它會拋出object null reference異常,所以最新的獲得E1的屬性的可能方法是什麼?

回答

1

您需要使用熱切加載,延遲加載或顯式加載來強制加載關係。

預先加載會立即加載你的關係,當你加載主實體:

var e4 = context.E4Set.Include(e => e.E3.E2.E1).First(...); 

延遲加載透明地將按需加載你的關係,當你第一次訪問它們(這將引發單獨的數據庫查詢每一個訪問導航屬性)。爲了使這項工作在支持延遲加載的每個實體中的所有導航屬性必須爲virtual

明確要求加載您手動執行加載已經加載的實體:

var e4 = context.EF4Set.First(...); 
var entry = context.Entry(e4); 
entry.Reference(e => e3).Load(); 

,您可以用預先加載結合起來:

entry.Reference(e => e3).Query().Include(e => e.E2.E1).Load();