将列表放在自己的表中

问题描述 投票:0回答:1

我正在尝试在我的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;
c# entity-framework-core
1个回答
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
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.