2010-06-03 9 views
5

Nos gustaría asignar una sola tabla en dos clases con NHibernate. El mapeo tiene que ser dinámicamente dependiendo del valor de una columna.NHibernate mapeando una tabla en dos clases con la selección

Aquí hay un ejemplo simple para hacerlo un poco más claro: Tenemos una tabla llamada Persona con las columnas id, Nombre y Sexo.

alt text

Los datos de esta tabla deben ser mapeados ya sea en el Hombre clase o en la Mujer clase en función del valor de la columna Sex.

alt text

en pseudocódigo:

create instance of Male with data from table Person where Person.Sex = 'm'; 
create instance of Female with data from table Person where Person.Sex = 'f'; 

El beneficio es que hemos inflexible de tipos de modelos de dominio y luego podemos evitar sentencias switch.

¿Esto es posible con NHibernate o tenemos que asignar la tabla Person a una clase Person plana primero? Luego, después, tendríamos que usar un método de fábrica personalizado que tome una instancia de Persona plana y devuelva una instancia de Mujer o Hombre. Sería bueno si NHibernate (u otra biblioteca) puede manejar esto.

Respuesta

9

Este es un caso bastante común para NHibernate. Puede asignar jerarquías de clases completas en una sola tabla.

Debe especificar un valor discriminador.

<class name="Person"> 
    <id .../> 

    <discriminator column="Sex" type="string" length="1" /> 

    <property name="Name"/> 
    <!-- add more Person-specific properties here --> 

    <subclass name="Male" discriminator-value="m"> 
    <!-- You could add Male-specific properties here. They 
    will be in the same table as well. Or just leave it empty. --> 
    </subclass> 

    <subclass name="Female" discriminator-value="f"> 
    <!-- You could add Female-specific properties here. They 
    will be in the same table as well. Or just leave it empty. --> 
    </subclass> 

</class> 
+0

¡Gracias! Funciona como se esperaba Hubiera sido extraño si no fuera compatible. Esta es una de las cosas por las que OR/M está hecho. –

Cuestiones relacionadas