繁体   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