Existe uma maneira para definir propriedades reutilizáveis ??para n-hibernate mapeamentos?
-
16-09-2019 - |
Pergunta
Eu tenho um cenário que eu quero adicionar algumas propriedades padrão para meus entidades. O que significa que, por exemplo, i terá 1 int e 2 propriedades de cadeia aplicada a todas as entidades relevantes. Tenho mais de 100 arquivos de mapeamento e a maioria, mas nem todos serão anfitriões a estas novas propriedades. Nas aulas é fácil definir esta; nos mapeamentos no entanto eu não encontrei nenhum que não seja a criação de um utilitário ou XSLT e aplicar esse ( Como definir reutilizáveis ??
No entanto eu quero ser capaz de adicionar propriedades / Modificar / Remover desta mapeamento "padrão".
thx para quaisquer respostas
Edit1: um exemplo do mapeamento eu quero adicionar
<property name="TimeOfEdit" column="TimeOfEdit" type="DateTime" not-null="true"/>
<many-to-one name="EditedBy" column="FK_EditedBy" cascade="save-update" not-null="true" />
Edit2: Tirei a solução aceite porque com NH 2.1.1 Entidades XML não estão funcionando (NH-1236) e NH irá lançar um "DTD é proibida neste documento XML"
Solução 5
Parece que o único a fazer isso, é usar Mapeamento ( http://ayende.com/Blog/archive/2008/05/01/Dynamic-Mapping-with-NHibernate.aspx )
como tal desde que eu já definida uma interface que meus entidades vai usar para as novas propriedades (digamos IAuditable) é apenas uma questão de executar o código apropriado no NH-sessão de inicialização
Configuration cfg = new Configuration() Mappings mappings = cfg.CreateMappings();
foreach (var persistentClass in mappings.Classes)
{
if (persistentClass.MappedClass is IAuditable)
{
...
}
}
e
cfg.BuildSessionFactory();
para tê-lo ligado e pronto para ser usado por cerca de 85 aulas o impacto no desempenho é insignificante
Outras dicas
Depende de como essas propriedades são implementadas em suas classes.
Se eles estão todos definidos em uma classe de base ou interface , você pode mapeá-los uma vez na classe base ou interface, e derivar usando union-subclass
. Existem algumas limitações. Leia neste capítulo na documentação NHibernate sobre isso.
Se você decidir colocá-los juntos em uma classe, você pode mapeá-los como um tipo user . Este será semelhante a um componente, mas você pode especificar algumas coisas como nomes de tipos, comprimentos e outros no tipo de usuário. Você ainda precisa especificar cada nome de coluna.
Não há outra opção: você pode usar entidades XML . Esta é uma característica bastante primitiva de XML que é apoiado pelo NHibernate. Leia neste capítulo na documentação de referência NH onde ele é mencionado.
Criando um gerador de código especial para o seu caso específico é a sua única opção.
Opção 1:
-Defina estes 3 Propriedades em uma classe base
-tem suas entidades herdar a partir dessa base
-conjunto up 'tabela por hierarquia de classes'
Opção 2:
3 -Defina estas propriedades como um componente.
-Você pode ter o mapeamento para estes 3 propriedades em um arquivo que é reutilizados.
Você pode dar uma olhada em FluentNHibernate , Ele vai simplificar o trabalho de mapeamento para você. Com Com o mapeamento de auto você pode precisar apenas de uma classe base abstrata para definir essas propriedades.