2010-06-03 12 views
5

Nous souhaitons mapper une seule table sur deux classes avec NHibernate. Le mappage doit être dynamiquement dépendant de la valeur d'une colonne.NHibernate mappant une table sur deux classes avec la sélection où

Voici un exemple simple pour le rendre un peu plus clair: Nous avons une table appelée Personne avec les colonnes id, Name et Sex.

alt text

Les données de ce tableau doivent être mis en correspondance soit sur la classe Homme ou Femme la classe en fonction de la valeur de la colonne Sexe.

alt text

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

L'avantage est que nous avons fortement typé modèles de domaine et peuvent ensuite éviter les instructions switch. Est-ce possible avec NHibernate ou est-ce que nous devons d'abord mapper la table Person dans une classe Person à plat? Ensuite, nous devrons utiliser une méthode d'usine personnalisée qui prend une instance de Person plate et retourne une instance Femme ou Homme. Serait bon si NHibernate (ou une autre bibliothèque) peut gérer cela.

Répondre

9

Ceci est un cas assez courant pour NHibernate. Vous pouvez mapper des hiérarchies de classe entières dans une seule table.

Vous devez spécifier une valeur de discriminateur.

<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

Merci! Fonctionne comme prévu Aurait été étrange si elle n'était pas supportée. C'est l'une des choses pour lesquelles OR/M est fait. –