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 ?? elementos em hibernação mapeamento ).

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"

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top