Составление списка списков - PullRequest
3 голосов
/ 23 мая 2009

У меня есть таблица UserPermissions с FK для таблицы пользователей по userId, а затем строковый столбец для строкового значения перечисления.

Я вижу ошибку NHibernate.MappingException: ассоциация из таблицы UserPermissions ссылается на не отображенный класс: GotRoleplay.Core.Domain.Model.Permission

Мое разрешение Enum:

    public enum Permission
{
    [StringValue("Add User")]
    AddUser,

    [StringValue("Edit User")]
    EditUser,

    [StringValue("Delete User")]
    DeleteUser,

    [StringValue("Add Content")]
    AddContent,

    [StringValue("Edit Content")]
    EditContent,

    [StringValue("Delete Content")]
    DeleteContent,
}

Свойство в моем классе пользователя:

public virtual IList<Permission> Permissions { get; set; }

Моя таблица базы данных:

CREATE TABLE dbo.UserPermissions
(
UserPermissionId            int                 IDENTITY(1,1) NOT NULL,
UserId                      int                 NOT NULL,
PermissionName              varchar (50)        NOT NULL,

CONSTRAINT PK_UserPermissions PRIMARY KEY CLUSTERED (UserPermissionId),
CONSTRAINT FK_UserPermissions_Users FOREIGN KEY (UserId) REFERENCES Users(UserId),
CONSTRAINT U_User_Permission UNIQUE(UserId, PermissionName)
)

Моя попытка отобразить свойство permissions моего пользовательского объекта:

HasManyToMany(x => x.Permissions)
             .WithParentKeyColumn("UserId")
             .WithChildKeyColumn("PermissionName")
             .WithTableName("UserPermissions")
             .LazyLoad();

Что я делаю неправильно, что он не может сопоставить разрешение со списком значений перечисления?

Ответы [ 3 ]

3 голосов
/ 15 сентября 2009

вот способ, который работал для меня

HasMany(x => x.Licences)
                .WithTableName("DriverLicence")
                .AsElement("Level").AsBag();

смотрите здесь для получения дополнительной информации ответ

1 голос
/ 15 сентября 2009

Я думал, что выложу код, который выбрал для своего решения. Это всего лишь обходной путь. Я бы хотел, чтобы Fluent поддерживал списки Enum, но пока это не так, вот возможное решение:

Enum - это мое перечисление, ваше стандартное перечисление.

public enum PermissionCode
{
    //site permissions 1-99
    ViewUser = 1,

    AddUser = 2,

    EditUser = 3,

    DeleteUser = 4
}

Далее, у меня есть класс разрешений.

public class Permission
{
    public virtual int PermissionId { get; set; }
    public virtual string PermissionName { get; set; }

    public virtual PermissionCode PermissionCode 
    {
        get
        {
            return (PermissionCode)PermissionId;
        }
    }
}

Как видите, у меня есть идентификатор и имя, а затем свойство, которое преобразует идентификатор в мое перечисление PermissionCode.

Отображение выглядит так:

public class PermissionMap : ClassMap<Permission>
{
    public PermissionMap() 
    {
        WithTable("Permissions");

        Id(x => x.PermissionId).GeneratedBy.Identity();

        Map(x => x.PermissionName);
    }
}

Поскольку свойство PermissionCode является производным, мы ничего не делаем в отображении.

Структура My Table за отображением выглядит следующим образом:

CREATE TABLE dbo.Permissions
(
    PermissionId                    int                 NOT NULL,
    PermissionName                  varchar (50)        NOT NULL,

    CONSTRAINT PK_Permissions PRIMARY KEY CLUSTERED (PermissionId)
)

Если вы хотите использовать имя вместо целочисленного значения, вы можете внести некоторые небольшие изменения. Это зависит от ваших личных предпочтений.

1 голос
/ 23 мая 2009

Вам необходимо указать тип, чтобы NHibernate мог преобразовать значение в таблице в член перечисления Permission.

HasManyToMany(x => x.Permissions)
         .WithParentKeyColumn("UserId")
         .WithChildKeyColumn("PermissionName")
         .WithTableName("UserPermissions")
         .LazyLoad()
         .CustomTypeIs(typeof(Permission));

Отредактировано, чтобы добавить: Извините, я должен был заметить, что вы имели это как ManyToMany. Это невозможно: у вас не может быть коллекции Users (другая сторона m: m), свисающей с перечисления. Вы должны определить это как 1: m или создать таблицу разрешений и класс и отобразить это как m: m.

...