2011-01-24 16 views
6

Ecco la mia gerarchia:NHibernate discriminati sottoclassi di una joined-subclass

 
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" 

Ecco il mio mappature in due file HBM separati:

 
<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> 

Il seguente è l'eccezione ottengo:

MappingException: errore di convalida XML: l'elemento 'join-subclass' nello spazio dei nomi 'urn: nhibernate-mapping-2.2' ha l'elemento figlio 'discriminator' non valido nello spazio dei nomi 'urn: nhibernate-mapping-2.2'.

Cosa mi manca? Non puoi mappare una gerarchia di sottoclassi discriminata di una sottoclasse unita?

risposta

2

Ciò che si desidera fare non è attualmente possibile.

Controllare http://www.nhforge.org/doc/nh/en/index.html#inheritance per i costrutti consentiti.

+0

Quindi, se ho capito bene, non posso mescolare strategie di ereditarietà diverse? Fondamentalmente, se ogni classe discende in definitiva da una classe base come "Entity", allora devo scegliere una strategia ed è questa per l'intera gerarchia. Capisco di non essere in grado di mixare allo stesso livello, ma c'è qualche possibilità che questo sarà supportato per diversi livelli in futuro? –

+1

@Travis, c'è un motivo per cui vuoi avere una tabella per Entity? – Vadim

+0

Sì; ci sono 6 campi comuni a tutte le mie entità [Id, IsActive, DateCreated, Creator, DateModified, Modifier]. Ma anche se non avessi bisogno di Entity, User avrebbe preso il suo posto in una situazione simile se avessi avuto bisogno di estendere il Contraente o il Dipendente. –

2

join-subclass non ha un discriminatore perché si trova in una tabella separata. È così che sa cos'è la sottoclasse. Se si desidera utilizzare un discriminatore, si utilizzerà una tabella per tutte le sottoclassi e si utilizzerà la mappatura subclass

+0

join-sottoclassi possono essere definite in file separati; tuttavia, questo è oltre il punto. Penso che ti sia sfuggito che la "tabella separata" è la radice di una nuova gerarchia ereditaria basata su un discriminatore. Forse potresti fornire una mappatura che farà qualcosa di simile a quello per cui sono perplesso. –

+0

@Travis, interessante riferimento alla sottoclasse. Tuttavia, la mappatura dell'utente deve ancora essere una sottoclasse, piuttosto che una sottoclasse unita, poiché si trova in un'altra tabella. – Vadim