У меня есть enum, называемый Permissions. Пользователю могут быть назначены разрешения, или разрешения могут быть назначены роли, и пользователю может быть назначена роль.
Пользователь и роль оба имеют свойство, подобное этому:
public virtual IList<Permission> Permissions { get; set; }
Я хочу использовать enum для Permissions, поэтому в моем коде я могу делать что-то вроде
public static bool UserHasPermission(Permission.DeleteUser)
Прямо сейчас у меня есть около 50 различных разрешений в моем перечислении. Было бы хорошо, если бы мне не пришлось заполнять зеркальный набор данных в базе данных. Мое перечисление выглядит так:
public enum Permission
{
//site permissions 1-99
[StringValue("View Users")]
ViewUser = 1,
[StringValue("Add User")]
AddUser = 2,
[StringValue("Edit User")]
EditUser = 3,
[StringValue("Delete User")]
DeleteUser = 4
...
}
В настоящее время у меня есть таблица для PermissionsId (int) и PermissionName (varchar (50)).
Вот мои таблицы с ролями. Пользовательская часть точно такая же, как и разрешения:
CREATE TABLE dbo.Roles
(
RoleId int IDENTITY(2,1) NOT NULL,
RoleName varchar (50) NOT NULL,
CONSTRAINT PK_Roles PRIMARY KEY CLUSTERED (RoleId)
)
CREATE TABLE dbo.RolePermissions
(
RolePermissionId int IDENTITY(1,1) NOT NULL,
RoleId int NOT NULL,
PermissionId int NOT NULL,
CONSTRAINT PK_RolePermissions PRIMARY KEY CLUSTERED (RolePermissionId),
CONSTRAINT FK_RolePermissions_Roles FOREIGN KEY (RoleId) REFERENCES Roles(RoleId),
CONSTRAINT U_RolePermissions UNIQUE(RoleId, PermissionId)
)
Тогда у меня есть таблица разрешений на случай, если она мне понадобится, но я просто не понимаю, как сопоставить поле id в RolePermissions или таблицу Permissions обратно с перечислением.
CREATE TABLE dbo.Permissions
(
PermissionId int NOT NULL,
PermissionName varchar (50) NOT NULL,
CONSTRAINT PK_Permissions PRIMARY KEY CLUSTERED (PermissionId)
)
- Можно ли сопоставить перечисление с таблицей?
- Должен ли я даже сопоставить это или я просто должен взять таблицу Permissions и в UserPermissions и RolePermissions оставить PermissionId только int и отобразить в перечисление?
- Если я сохраню таблицу разрешений, есть ли способ для nhibernate автоматически заполнить данные в таблице разрешений данными из перечисления?
Прямо сейчас у меня нет сопоставления с перечислением полномочий, кроме как что-то вроде этого:
HasManyToMany(x => x.Permissions)
.WithParentKeyColumn("RoleId")
.WithChildKeyColumn("PermissionId")
.WithTableName("RolePermissions")
.LazyLoad()
.Cascade.All();
К сожалению, это вызывает ошибку:
Ассоциация из таблицы
RolePermissions относится к не нанесенному на карту
учебный класс:
GotRoleplay.Core.Domain.Model.Permission
Что я делаю не так с перечислениями? Существует ли стандартный способ или наилучшая практика для их использования с fluentnhibernate, когда перечисление представляет собой список значений объекта, а не только одно значение?