2010-04-29 6 views
1

Supposons que j'ai cette relation:discriminante basée sur la propriété rejoint

abstract class Base { int Id; int JoinedId; ... } 
class Joined { int Id; int Discriminator; ... } 
class Sub1 : Base { ... } 
class Sub2 : Base { ... } 

pour les tableaux suivants:

table Base (Id int, JoinedId int, ...) 
table Joined (Id int, Discriminator int, ...) 

Je voudrais mettre en place une cartographie de l'héritage table par hiérarchie de la base , Sub1, Sub2, mais en utilisant la propriété Disciminator de la classe Joined comme discriminateur.

est ici l'idée générale du fichier de mapping:

<class name="Base" table="Base"> 
    <id name="Id"><generator class="identity"/></id> 

    <discriminator /> <!-- ??? or <join> or <many-to-one>? --> 

    <subclass name="Sub1" discriminator-value="1">...</subclass> 
    <subclass name="Sub2" discriminator-value="2">...</subclass> 
</class> 

Est-il possible d'accomplir quelque chose comme ça avec le <discriminator>, <join> ou <many-to-one>? NHiberante semble supposer que le discriminateur est une colonne sur la table donnée (ce qui a du sens pour moi .. Je sais que ce n'est pas orthodoxe).

Merci.

Répondre

0

La réponse courte est: cela ne peut être fait, sauf si vous utilisez une vue comme table.

J'ai rencontré le même problème dans mon projet actuel et j'ai dû contourner ce problème en utilisant un modèle de stratégie.

3

ne pouvez-vous utiliser un discriminateur-formule avec un sous-sélection sur Joined?

<discriminator formula="(select j.discriminator from Joined j where j.id = joinedid)"> 
+0

J'ai travaillé pour moi! Voir mes notes ci-dessous. –

2

que je recherchais exactement la même chose et après avoir vu le poste de Diego, je suppose que ce n'a pas été possible et a continué avec la recherche Google en essayant de trouver des alternatives. Mais après avoir trouvé une solution qui fonctionne par essais et erreurs, j'ai réalisé que c'est exactement la même solution que celle publiée ci-dessus par Meriton. Les mises en garde que j'ai rencontrées cependant (ce qu'il explique mais n'explique pas), c'est que vous devez entièrement qualifier votre champ dans le forumla, vous devez seulement retourner un champ, et vous devez envelopper votre formule entre parenthèses. Si vous laissez le nom de la table hors du nom du champ, il supposera qu'il s'agit d'un champ sur la table en cours pour laquelle la requête est demandée et sera préfixé avec quelque chose comme MyTable0_1. qui va casser votre requête. Les parenthèses doivent être affichées comme une instruction select imbriquée. L'utilisation d'une formule déterminera la valeur de votre champ discriminant à comparer à la valeur du discriminateur dans votre sous-classe. Quand j'ai vérifié mon SQL envoyé je trouve que ce essentiellement m'a donné ce ... (note mon champ discriminateur était un uniqueidentifier) ​​

....WHERE [email protected] and (SELECT ClientTypes.ClientClassId FROM ClientTypes WHERE ClientTypes.TypeId = client0_.TypeId)='f04c03db-d469-4c01-83c5-5a19c0aea264'

Hope this helps autres à ce problème.

Questions connexes