NHibernate от «один-ко-многим» к «один-к-одному»

Я создаю систему безопасности для программного обеспечения, которое я создаю, и я хотел бы знать, как я могу сделать следующее в 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, Username)
привилегии (UserID, PrivilegeType, чтение, запись, изменение, удаление)

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

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


person Michal Ciechan    schedule 13.05.2010    source источник


Ответы (1)


Я думаю, что способ сделать это - создать два подкласса класса 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; }
person Jan Willem B    schedule 13.05.2010
comment
У меня нет Fluent nhibernate, есть ли способ сделать это в обычном nhibernate? Вроде хороший способ сделать это :) - person Michal Ciechan; 14.05.2010