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

本文关键字:EF 代码 关系 模型 枚举 之间 建立 | 更新日期: 2023-09-27 18:19:06

例如:

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
}

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

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

你可以这样做吗?

[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(...)等,以使在有人错误处理位操作时引入相当严重的错误更加困难。

除非它是性能要求或其他什么,我可能只是把权限作为一个类,并与开销共存。

一些阅读:

  • 设计标志枚举
  • Enum.HasFlag ()
  • FlagAttribute
  • 在枚举上最常见的c#按位操作