我正在尝试在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;
答案 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
});
}