NHibernate от одного ко многим до одного к одному - PullRequest
0 голосов
/ 13 мая 2010

Я создаю систему безопасности для создаваемого им программного обеспечения, и я хотел бы знать, как я могу сделать следующее в NHibernate (если это возможно)

Класс учетной записи пользователя:

public class UserAccount
{
    public virtual int UserID { get; set; }
    public virtual String Username { get; set; }
    public virtual Privilege InvoicePrivilege { get; set; }
    public virtual Privilege TradePrivilege { get; set; }
}

Класс привилегий:

public class Privilege
{
    public virtual bool Read { get; set; }
    public virtual bool Write { get; set; }
    public virtual bool Delete { get; set; }
    public virtual bool Modify { get; set; }
}

У меня будет большое количество этих объектов привилегий (по одному для каждой торгуемой сущности), поэтому в базе данных у меня есть следующие таблицы:

UserAccounts ( UserID , Имя пользователя)
Привилегии ( UserID, PrivilegeType , чтение, запись, изменение, удаление)

Как сопоставить свойство InvoicePrivielge из учетной записи пользователя с привилегией (UserID, "Invoice").

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

1 Ответ

2 голосов
/ 13 мая 2010

Я думаю, что способ сделать это - создать два подкласса класса Privilege:

public class InvoicePrivilege : Privilege 
{
}
public class TradePrivilege : Privilege
{
}

и установите столбец и значение дискриминатора. В беглом отображении:

public class PrivilegeMap : ClassMap<Privilege>
{
  public PrivilegeMap()
  { 
     // ...
     DiscriminateSubClassesOnColumn("PrivilegeType")
       .SubClass<InvoicePrivilege>("Invoice", x => x.Map( ... ))
       .SubClass<TradePrivilege>("Trade", x => x.Map( ...));
  }
}

и использовать подклассы в UserAccount

public virtual InvoicePrivilege InvoicePrivilege { get; set; }
public virtual TradePrivilege TradePrivilege { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...