如何首先在 EF 代码中建立模型和枚举之间的多对多关系?

Posted

技术标签:

【中文标题】如何首先在 EF 代码中建立模型和枚举之间的多对多关系?【英文标题】:How to build a many-to-many relation between a model and an enum, in EF code first? 【发布时间】:2014-08-23 00:36:56 【问题描述】:

例如:

public class Role

    public Role()
    
        Permissions = new HashSet<Permission>();
    

    public string ID  get; set; 
    public string Name  get; set; 

    public virtual ICollection<Permission> Permissions  get; set; 


public enum Permission

    UserManagement = 0,
    DepartmentManagement = 1,
    RoleManagement = 2,
    ModifyPassword = 3

通常,在一个模型和另一个模型之间,我可以编写两个导航属性。但是对于这种情况,我不能在枚举中编写导航属性。

【问题讨论】:

【参考方案1】:

你能改成这样吗?

[Flags]
public enum Permission

    UserManagement = 1,
    DepartmentManagement = 2,
    RoleManagement = 4,
    ModifyPassword = 8


public class Role

    public string ID  get; set; 
    public string Name  get; set; 
    public Permission Permissions  get; set; 

然后,例如:

var role = new Role();
//assign multiple values
role.Permissions = Permission.UserManagement | Permission.ModifyPassword;
//add a value
role.Permissions |= Permission.DepartmentManagement;
//remove a value
role.Permissions &= ~Permission.DepartmentManagement;
//test for a value
bool hasPermission = (role.Permissions & Permission.ModifyPassword) != 0;

警告:

可以考虑公开一些方法,例如 RemovePermission(...)AddPermission(...) 等,以便在有人错误处理按位操作时更难引入相当严重的错误。

除非它是性能要求或其他什么,否则我可能只是将权限设置为一个类并承担开销。

一些阅读:

Designing Flag Enums Enum.HasFlag() FlagAttribute Most common C# bitwise operations on enums

【讨论】:

以上是关于如何首先在 EF 代码中建立模型和枚举之间的多对多关系?的主要内容,如果未能解决你的问题,请参考以下文章

当我使用中间模型时,如何建立强制唯一性的多对多关系?

定义引用同一个表的多对多关系(EF7/core)

Django - 使用表单集在不通过表的情况下建立 2 个模型之间的多对多关系

EF Core中如何设置数据库表自己与自己的多对多关系

如何使用 MVC3 多对多关系和 EF4.1 模型优先检索数据?

EF基础知识小记五(一对多多对多处理)