2010-10-06 27 views
9

Impossible d'obtenir NHibernate pour générer la requête correcte. Il continue à utiliser les clés primaires des deux tables que je rejoins pour la relation un-à-un, et je ne peux pas comprendre comment spécifier la clé étrangère dans l'une des tables.Mappage un-à-un de NHibernate, clés non-primaires

tableA  tableB 
{ aID,  { bID, 
    bID,  z, 
    c,   y, 
    d }   x } 

de sorte que le tableA devrait se joindre à l'aide tableB tableA.bID = tableB.bID. Comment puis-je le spécifier dans le mapping pour tableA? J'utilise la classe tableA pour récupérer une ligne à partir de tableA et une ligne à partir de tableB, car il s'agit d'une véritable relation un à un. NHibernate génère le sql pour joindre les tables en utilisant tableA.aID = tableB.bID, ce qui est faux.

Cela ne fonctionne pas:

<class name="tableA" table="tableA"> 
    <id name="aID" column="aID" /> 
    <property name="bID" column="bID" /> 
    <property name="c" column="c" /> 
    <property name="d" column="d" /> 
    <one-to-one name="otherThing" class="tableB" foreign-key="bID" /> 
</class> 

<class name="tableB" table="tableB"> 
    <id name="bID" column="bID" /> 
    <property name="z" column="z" /> 
    <property name="y" column="y" /> 
    <property name="x" column="x" /> 
</class> 

Répondre

8

Ceci est la bonne façon de mapper:

<class name="tableA" table="tableA"> 
    ... 
    <many-to-one name="otherThing" class="tableB" column="bID" unique="true" /> 
</class> 
  • Je suppose que cela est vraiment un à un, d'où le unique.
  • Vous devez mapper chaque colonne une FOIS. Si c'est une relation, alors ce n'est pas une propriété int.

Une référence de tableB à tableA seraient mises en œuvre:

<class name="tableB" table="tableB"> 
    ... 
    <one-to-one name="A" class="tableA" property-ref="otherThing" /> 
</class> 

Tout cela est documenté dans http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-onetoone

+0

Merci. Ça a marché. Confus que je dois utiliser un élément many-to-one quand c'est vraiment un mapping one-to-one. J'ai également mis le type d'extraction à "joindre" ainsi réduire le nombre de requêtes. – MonkeyWrench

+0

Mais oui, si vous pouvez montrer un exemple bidirectionnel, ce serait éducatif. – MonkeyWrench

+0

Et voilà ... –

0

Vous ne devriez pas avoir à spécifier la propriété comme une propriété dans votre fichier de mappage lorsque vous définissez également une à une relation pour la même valeur. Je ne l'ai pas utilisé un à un, donc il peut y avoir une autre question, mais je supprimer la ligne:

<property name="bID" column="bID" /> 

de tableA et voir si cela aide.

+0

N'a pas fait une différence, et je ne sais pas pourquoi il le ferait. Les deux tables ont cette colonne, et les deux mappages ne devraient avoir aucun problème à avoir ces propriétés. – MonkeyWrench

+0

Ça vaut le coup. J'ai trouvé des effets secondaires bizarres avec des trucs comme ça, alors j'ai pensé que je le lancerais là-bas. – Kendrick