Pregunta

Tengo un escenario en el que quiero agregar algunas propiedades estándar para mi entidades.En el sentido de que se tienen, por ejemplo1 int y 2 propiedades de la cadena de aplicar a todas las entidades pertinentes.Tengo más de 100 archivos de asignación y la mayoría pero no todos, serán los anfitriones de estas nuevas propiedades.En las clases de su fácil definir este;en las asignaciones sin embargo, he encontrado ninguna referencia a otros que la creación de una utilidad o xslt y aplicar (Cómo definir reutilizables <generator> elementos de mapeo hibernate).

Sin embargo, quiero ser capaz de agregar/modificar/eliminar propiedades de este "estándar" de la cartografía.

gracias por las respuestas

Edit1:un ejemplo de la asignación quiero agregar

<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:He quitado la aceptación de la solución, porque con NH 2.1.1 Entidades XML no están trabajando (NH-1236) y NH lanzará una "DTD está prohibido en este documento XML"

¿Fue útil?

Solución 5

Parece que la única para hacer esto, es usar Mapeo Dinámico ( http://ayende.com/Blog/archive/2008/05/01/Dynamic-Mapping-with-NHibernate.aspx )

como tal, puesto que ya hemos definido una interfaz que mis entidades utilizarán para las nuevas propiedades (digamos IAuditable) es sólo una cuestión de ejecutar el código apropiado en la inicialización NH-session

Configuration cfg = new Configuration() Mappings mappings = cfg.CreateMappings(); 
foreach (var persistentClass in mappings.Classes) 
{ 
   if (persistentClass.MappedClass is IAuditable)
   {
     ...
   }
}

y

cfg.BuildSessionFactory();

tenerlo conectado y listo para ser utilizado por cerca de 85 clases del impacto en el rendimiento es insignificante

Otros consejos

Depende de cómo estas propiedades se implementan en sus clases.

Si están todos definidos en un clase base o interfaz , se pueden mapear una vez en la clase base o interfaz, y derivar usando union-subclass. Hay algunas limitaciones. Leer este capítulo en la documentación NHibernate al respecto.

Si decide ponerlos juntos en una clase, se puede asignar como un Tipo de usuario . Esto será similar a un componente, pero se puede especificar algunas cosas como nombres de tipos, longitudes y otros en el tipo de usuario. Todavía es necesario especificar el nombre de cada columna.

Hay otra opción: se puede utilizar entidades XML . Esta es una característica bastante primitiva a partir de XML que es apoyado por NHibernate. Leer este capítulo en la documentación de referencia NH donde se menciona.

Creación de un generador de código especial para su caso específico es su única opción.

Opción 1:
-Definir estos 3 propiedades en una clase base

-tienen sus entidades heredan de esta base

-Establecer 'tabla por jerarquía de clases'

Opción 2:

-Definir estos 3 propiedades como un componente.

-Se puede tener la asignación para estas 3 propiedades en un archivo que se reutiliza.

Es posible echar un vistazo a fluentNHibernate , simplificará el trabajo de mapeo para usted. Con con mapeo automático puede que sólo necesite una clase base abstracta para definir estas propiedades.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top