将清单放在自己的表格中

时间:2018-09-06 08:17:25

标签: c# entity-framework-core

我正在尝试在C#应用程序中建立权限系统。

我的想法是这样的:

Class: Permission
 - string name;
 - string value;

Class: Role
 - string name
 - List<Permission> Permissions;

Class: User
 - List<Role> Roles;
 - List<Permission> AdditionalPermissions;

非常好而且灵活。在特殊情况下,我可以创建具有权限的角色,甚至可以自定义向某些用户分配权限。

实体框架还有其他计划,在数据库中,权限表具有UserID和RoleID引用,与我所期望的不完全相同。

Table: Permissions
 - int id;
 - nvarchar name;
 - nvarchar value;
 - int UserID
 - int RoleID


Table: Roles
 - int id;
 - nvarchar name;

Table: Users;
 - int id

我可以使实体框架创建如下结构,而无需自己创建C#类吗?

Table: Permissions
 - int id;
 - nvarchar name;
 - nvarchar value;

Table: Roles
 - int id;
 - nvarchar name;

Table: Users;
 - int id

Table: Users_Permissions
 - int UserID;
 - int PermissionID;

Table: Role_Permissions
 - int RoleID
 - int PermissionID;

1 个答案:

答案 0 :(得分:4)

当您像这样构造实体类时,db结构将显示出您想要的方式:

public class Permission
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }

}

public class RolePermission
{
    [ForeignKey(nameof(Role))]
    public int RoleId { get; set; }
    public virtual Role Role { get; set; }

    [ForeignKey(nameof(Permission))]
    public int PermissionId { get; set; }
    public virtual Permission Permission { get; set; }
}

public class Role
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<RolePermission> RolePermissions { get; set; }

}

要确保RolePermission表获得两个外键的复合主键,请将其添加到您的上下文中:

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<RolePermission>().HasKey(table => new {
        table.RoleId,
        table.PermissionId
    });
}