簡體   English   中英

實體框架虛擬集合初始化

[英]Entity Framework virtual collections initialization

我有以下課程:

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; }
    }

我希望每個用戶實例在Roles集合中至少具有Role(默認角色,例如“ RegularUser”角色)。 如果我組成一個新用戶,但沒有為其分配任何角色,也沒有將其添加到數據庫,則在檢索時,我應該將角色集合為空。

我應該在User構造函數中實例化Roles集合並在其中添加默認Role嗎? 如果我的數據庫中已經有一些角色,這不會覆蓋Roles集合嗎? 虛擬集合何時准確初始化?

我該如何解決這個問題?

問候,愛奧努特

這就是為什么我認為EF類模型主要是數據訪問層而不是域層的原因。 我不會在EF類的持久化集合中添加任何默認對象。

假設您總是在集合為空時(例如在getter中)添加默認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角色臨時構建在內存中的。

如果要顯示默認角色,最好顯示一個可以在其中添加角色的視圖模型。

將Factory用於任何創建對象邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM