Nibernate de um para muitos a um a um
-
26-09-2019 - |
Pergunta
Estou criando o sistema de segurança para o software que estou criando e gostaria de saber como posso fazer o seguinte no Nibernate (se possível)
Classe de conta de usuário:
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; }
}
Classe de privilégio:
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; }
}
Eu terei um grande número desses objetos de privilégio (um para cada entidade negociada); portanto, no banco de dados, tenho as seguintes tabelas:
Contas de usuário ( ID do usuário, Nome de usuário)
Privilégios (UserID, privilegetypey, Leia, escreva, modifique, exclua)
Como posso mapear a propriedade InvoicePrivielge da conta de usuário para o privilégio (UserID, 'Fatura').
Eu poderia fazer isso usando muitos para um, mas não quero uma coleção de privilégios, prefiro mapeá-lo para sua propriedade.
Solução
Eu acho que uma maneira de fazer isso é criar duas subclasses da classe de privilégios:
public class InvoicePrivilege : Privilege
{
}
public class TradePrivilege : Privilege
{
}
e defina a coluna e o valor do discriminador. No mapeamento fluente:
public class PrivilegeMap : ClassMap<Privilege>
{
public PrivilegeMap()
{
// ...
DiscriminateSubClassesOnColumn("PrivilegeType")
.SubClass<InvoicePrivilege>("Invoice", x => x.Map( ... ))
.SubClass<TradePrivilege>("Trade", x => x.Map( ...));
}
}
e use as subclasses no UserAccount
public virtual InvoicePrivilege InvoicePrivilege { get; set; }
public virtual TradePrivilege TradePrivilege { get; set; }