Разместите список в своей таблице - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь создать систему разрешений в своем приложении C #.

Моя идея такова:

Class: Permission
 - string name;
 - string value;

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

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

Очень красиво и гибко. В особых случаях я могу создавать роли с разрешениями и даже настраивать их для некоторых пользователей.

У Entity Framework были другие планы, в базе данных таблица разрешений имеет 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 голосов
/ 06 сентября 2018

Когда вы структурируете свои классы сущностей следующим образом, структура БД получается так, как вы хотите:

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
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...