2010-06-03 5 views
5

Wir möchten eine einzige Tabelle auf zwei Klassen mit NHibernate zuordnen. Das Mapping muss dynamisch abhängig vom Wert einer Spalte sein.NHibernate Mapping einer Tabelle auf zwei Klassen mit der Auswahl

Hier ist ein einfaches Beispiel, um es ein wenig klarer zu machen: Wir haben eine Tabelle namens Person mit den Spalten ID, Name und Geschlecht.

alt text

Die Daten aus dieser Tabelle sollten entweder auf die Klasse Male oder für die Klasse Female in Abhängigkeit vom Wert des Spalts Sex gemappt werden.

alt text

In Pseudocode:

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

Der Vorteil ist, wir haben Domain-Modelle stark typisiert und können später Switch-Anweisungen vermeiden.

Ist dies mit NHibernate möglich, oder müssen wir zuerst die Personentabelle in eine flache Personenklasse umwandeln? Danach müssten wir eine benutzerdefinierte Factory-Methode verwenden, die eine flache Person-Instanz verwendet und eine weibliche oder männliche Instanz zurückgibt. Wäre gut, wenn NHibernate (oder eine andere Bibliothek) damit umgehen könnte.

Antwort

9

Dies ist ein häufiger Fall für NHibernate. Sie können ganze Klassenhierarchien in einer einzigen Tabelle abbilden.

Sie müssen einen Diskriminatorwert angeben.

<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

Vielen Dank! Funktioniert wie erwartet. Wäre seltsam gewesen, wenn es nicht unterstützt wurde. Dies ist eines der Dinge, für die OR/M gemacht ist. –

Verwandte Themen