Свободный внешний ключ сопоставления NHibernate - PullRequest
4 голосов
/ 24 марта 2011

У меня есть база данных, которую я пытаюсь смоделировать с помощью Fluent NHibernate.

таблицы в вопросах:

Пользователь: PK Id, Имя, FK accessType, FK авторизация

AccessType: PK Id, Имя

Авторизация: PK Id, Имя

Разрешение: PK Id, FK menuId, FK accessId, FK authId

Пользовательский объект:

    public Users()
    {
        Permissions = new List<Permissions>();
    }

    public virtual AccessTypes AccessType { get; set; }

    public virtual Authorization Authorization { get; set; }

    public virtual string Name { get; set; }

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

Права доступа:

public class Permissions : EntityWithTypedId<long>
{
    public virtual Menus Menu { get; set; }

    public virtual AccessTypes AccessType { get; set; }

    public virtual Authorization Authorization { get; set; }
}

Карта пользователя:

    public UsersMap()
    {
        Table("USERS");
        Map(x => x.Name, "NAME");
        References<AccessTypes>(x => x.AccessType, "ACCESS_TYPE_ID");
        References<Authorization>(x => x.Authorization, "AUTHORIZATION_ID");
        Id(x => x.Id, "ID")
            .Column("ID")
            .GeneratedBy.Assigned();


        HasMany<Permissions>(x => x.Permissions)
            .KeyColumns.Add("ACCESS_TYPE_ID", "AUTHORIZATION_ID")                       
            .Inverse()
            .Cascade.None();

    }

Карта разрешений:

    public PermissionsMap()
    {
        ReadOnly();
        Table("PERMISSIONS");
        References<Menus>(x => x.Menu, "MENU_ID");
        References<AccessTypes>(x => x.AccessType, "ACCESS_TYPE_ID");
        References<Authorization>(x => x.Authorization, "AUTHORIZATION_ID");
        Id(x => x.Id, "ID")
               .Column("ID")
               .GeneratedBy.Assigned();
    }

Я получил эту ошибку:Внешний ключ (FK79B2A3E83BA4D9E3: PERMISSIONS [ACCESS_TYPE_ID, AUTHORIZATION_ID])) должен иметь то же количество столбцов, что и ссылочный первичный ключ (USERS [ID])

Мне нужно получить список разрешений, проверив userType доступа иавторизация пользователя.Мой вопрос: Как я могу сопоставить список разрешений в сопоставлении пользователей?Должен ли я использовать троичное объединение?

Кто-нибудь знает, как это сделать?

1 Ответ

3 голосов
/ 26 марта 2011

Этот сценарий не поддерживается.NHibernate имеет функцию под названием property-ref, которую можно использовать (но ее следует избегать) в старых базах данных, которые были разработаны плохо.Однако свойство-ref поддерживает ссылку только на один столбец без первичного ключа.Поскольку вы пытаетесь сослаться на два таких столбца, это не сработает.

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

Вы все еще можете иметь свойство для списка в классе Users и заполнить его дополнительным методом, который просто считывает Permissions с использованием условия Where для обоих столбцов.Тем не менее, я бы посоветовал против этого.Я бы написал такой метод (код не проверен):

public IList<Permissions> GetPermissionsForUser(Users user)
{
    return session.QueryOver<Permissions>()
        .Where(p => p.Authorization.Equals(user.Authorization))
        .And(p => p.AccessType.Equals(user.AccessType)).List();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...