3

不知道如何正確命名。我有m:n關係中的兩個實體:成員和角色。EF代碼第一個相關的實體上下文失敗

public class Role 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 

    public ICollection<Member> MembersInRole { get; set; } 
} 

public class Member 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Password { get; set; } 
    public string Email { get; set; } 

    public ICollection<Role> Roles { get; set; } 
} 

我已經取得了一些種子數據:
http://i56.tinypic.com/2vjvj1w.png

而寫測試:
http://i54.tinypic.com/112916b.png

的問題是,我的會員單位沒有分配角色,甚至當我在上下文中創建它們時(如您在圖像中看到的那樣)。我不知道什麼是錯的。數據庫中的表似乎沒問題。我不確定上下文實例是否有問題。但它應該沒問題,因爲我一直在處理種子數據。通過將其明確包含

回答

2

嘗試渴望加載的角色:

Member admin = db.Members.Include("Roles").FirstOrDefault(m => m.Name == "Admin"); 
+0

謝謝,這是一個可行的解決方案。 – Damb 2011-04-10 10:40:47

9

MembersRoleRoles導航屬性不是虛擬所以延遲加載EF不能克里特代理。正因爲如此,您必須明確要求EF加載您的導航屬性。無論是紀念你的屬性爲虛擬:

public class Role 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 

    public virtual ICollection<Member> MembersInRole { get; set; } 
} 

public class Member 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Password { get; set; } 
    public string Email { get; set; } 

    public virtual ICollection<Role> Roles { get; set; } 
} 

或者使用@Yakimych方法。 EF 4.1中的熱切加載也可以用lambdas來定義:

Member admin = db.Members.Include(m => m.Roles) 
         .FirstOrDefault(m => m.Name == "Admin"); 
+0

+1感謝您的進一步解釋。我很愚蠢,實際上忘記了這一點。 – Damb 2011-04-10 10:39:51