![](/img/trans.png)
[英]Entity Framework 6: virtual collections lazy loaded even explicitly loaded on a query
[英]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.