2011-01-24 9 views
6

Aquí es mi jerarquía:NHibernate discriminado Las subclases de un Usuario-Subclase

 
class abstract Entity { /*members*/ } // mapped to entity table 
class abstract User : Entity { /*members*/ } // mapped to user table 

class Employee : User { /*no members*/ } // no table, discriminator = "E" 
class Contractor : User { /*no members*/ } // no table, discriminator = "C" 

Aquí está mi asignaciones en dos archivos HBM separadas:

 
<class name="Entity" table="entity" xmlns="urn:nhibernate-mapping-2.2"> 
    <id name="Id" column="id"> 
    <generator class="guid.comb" /> 
    </id> 
    <property ... /> 
</class> 

<joined-subclass name="User" extends="Entity" table="user"> 
    <key column="id" /> 
    <discriminator column="type" /> 
    <property ... /> 
    <subclass name="Employee" discriminator-value="E" /> 
    <subclass name="Contractor" discriminator-value="C" /> 
</joined-subclass> 

La siguiente es la excepción consigo:

MappingException: error de validación de XML: el elemento 'joined-subclass' en el espacio de nombres 'urn: nhibernate-mapping-2.2' tiene un elemento secundario no válido 'discriminator' en el espacio de nombres 'urn: nhibernate-mapping-2.2'.

¿Qué me estoy perdiendo? ¿No se puede mapear una jerarquía de subclases discriminada de una subclase unida?

Respuesta

2

Lo que quiere hacer no es posible actualmente.

Compruebe http://www.nhforge.org/doc/nh/en/index.html#inheritance para las construcciones permitidas.

+0

Entonces, si entiendo esto bien, ¿no puedo mezclar diferentes estrategias de herencia? Básicamente, si cada clase finalmente desciende de una clase base como "Entidad", entonces tengo que elegir una estrategia y eso es todo para la jerarquía completa. Entiendo que no puedo mezclar en el mismo nivel, pero ¿hay alguna posibilidad de que sea compatible con diferentes niveles en el futuro? –

+1

@Travis, ¿hay algún motivo por el que quiera tener una mesa para Entity? – Vadim

+0

Sí; hay 6 campos que son comunes a todas mis entidades [Id, IsActive, DateCreated, Creator, DateModified, Modifier]. Pero incluso si no necesitara Entity, el Usuario tomaría su lugar en una situación similar si tuviera que extender Contractor o Empleado. –

2

joined-subclass no tiene discriminador porque está en una tabla separada. Así es como sabe cuál es la subclase. Si desea utilizar un discriminador, utilizaría una tabla para todas sus subclases y utilizaría la asignación subclass

+0

Las subclases unidas se pueden definir en archivos separados; sin embargo, eso está al lado del punto. Creo que te perdiste que la "tabla separada" es la raíz de una nueva jerarquía de herencia basada en un discriminador. Tal vez podría proporcionar una asignación que hará algo similar a lo que me deja perplejo. –

+0

@Travis, interesante re se unió a la subclase. Sin embargo, su mapeo de usuario todavía tiene que ser una subclase, en lugar de una subclase unida, ya que está en otra tabla. – Vadim

Cuestiones relacionadas