2014-04-01 36 views
1

我有以下類別:實體框架虛擬集合初始化

public class User 
{ 
     public Guid Id { get; set; } 
     public string UserName { get; set; } 
     //... Other properties here 

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

和角色類

public class Role 
    { 
     public Guid Id { get; set; } 
     public string Name { get; set; } 

     public virtual User User { get; set; } 
    } 

我要爲每個用戶實例,至少有上角色(如「RegularUser默認角色「角色)在角色集合中。 在組成新用戶的情況下,如果我沒有爲其分配任何角色並將其添加到數據庫,則在檢索時,我應該將Roles集合清空。

我應該在User構造函數中實例化Roles集合並添加一個默認的Role?如果我的數據庫中已經存在一些角色,這不會覆蓋Roles集合嗎?虛擬集合究竟是什麼時候初始化的?

我該如何解決這個問題?

問候, 約努茨

回答

1

這就是爲什麼它是我的意見是,EF類模型主要是一個數據訪問層,而不是域層。我不會將任何默認對象添加到EF類中的持久集合。

假設您在集合爲空時總是添加默認Role,例如,在吸氣劑中:

public virtual ICollection<Role> Roles 
{ 
    get 
    { 
     if (!this._roles.Any()) // initialized in the constructor 
      this._roles.Add(new Role {...}); 
     return this._roles; 
    } 
    set { this._roles = value; } 
} 

這會導致不一致的行爲。如果EF從數據庫獲取User對象,則根據查詢,它可能會將全新集合分配給Roles,但它也可能會向其中添加項目。例如,Include與選擇user.Roles不同。在後一種情況下,默認角色總是在收藏中,在前一種情況下,從不。 (解釋這一切有點不合時宜,我不確定是否掌握了所有內部機制)。此外,您可能會無意中將默認角色保存到數據庫。

我會處理授權邏輯中的無角色用戶。當您評估用戶的權限時,您可以始終將默認角色添加到您從User的角色臨時在內存中創建的本地角色集合中。

如果要顯示默認角色,最好顯示可添加角色的視圖模型。

-1

對任何創建對象邏輯使用Factory。