У меня есть перечисление под названием Разрешения. Пользователю могут быть назначены разрешения, или разрешения могут быть назначены роли, и пользователю может быть предоставлена роль.FluentNHibernate и Enums
пользователя и роль оба имеют свойство так:
public virtual IList<Permission> Permissions { get; set; }
Я хочу использовать перечисление для разрешения, чтобы в моем коде я могу делать вещи, как
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
...
}
В настоящее время у меня есть таблица разрешений, что является PermissionId (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)
)
Тогда, у меня есть разрешения TBLE в случае мне это нужно, но я просто не понимаю, как отобразить либо поле идентификатора в RolePermissions или таблицу разрешений обратно в перечисление.
CREATE TABLE dbo.Permissions
(
PermissionId int NOT NULL,
PermissionName varchar (50) NOT NULL,
CONSTRAINT PK_Permissions PRIMARY KEY CLUSTERED (PermissionId)
)
- Могу ли я сопоставить перечисление в таблицу?
- Должен ли я отображать его, или я должен просто вынуть таблицу разрешений, а в UserPermissions и RolePermissions оставить PermissionId только int и нанести карту на enum?
- Если я сохраняю таблицу разрешений, есть ли способ, чтобы nhibernate мог автопопулировать данные в таблице разрешений из данных в перечислении?
Прямо сейчас, у меня нет отображения на разрешение перечисления, кроме чего-то вроде этого:
HasManyToMany(x => x.Permissions)
.WithParentKeyColumn("RoleId")
.WithChildKeyColumn("PermissionId")
.WithTableName("RolePermissions")
.LazyLoad()
.Cascade.All();
К сожалению, это приводит к ошибке:
An association from the table RolePermissions refers to an unmapped class: GotRoleplay.Core.Domain.Model.Permission
Что я делаю неправильно с перечислениями? Существует ли стандартный способ или наилучшая практика для их использования с fluentnhibernate, когда перечисление представляет собой список значений объекта, а не только одно значение?
Я не могу помочь вам с лучшим решением, но я рад, что вы нашли ответ. – CalebHC