2010-10-06 10 views
9

Kann nicht NHibernate die richtige Abfrage generieren. Es verwendet weiterhin die Primärschlüssel der beiden Tabellen, die ich für die Eins-zu-eins-Beziehung einfüge, und ich kann nicht herausfinden, wie der Fremdschlüssel in einer der Tabellen angegeben wird.NHibernate Eins-zu-eins-Zuordnung, nicht primäre Schlüssel

Daher sollte die TabelleA mit tabellarB mit TableA.bID = tableB.bID verbinden. Wie kann ich dies im Mapping für TabelleA angeben? Ich verwende die tableA-Klasse, um eine Zeile aus tableA und eine Zeile aus tableB abzurufen, da es sich um eine echte Eins-zu-Eins-Beziehung handelt.

NHibernate generiert die SQL, um die Tabellen mithilfe von tableA.aID = tableB.bID zu verbinden, was falsch ist.

funktioniert das nicht:

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

Antwort

8

Dies ist der richtige Weg, es zu kartieren:

<class name="tableA" table="tableA"> 
    ... 
    <many-to-one name="otherThing" class="tableB" column="bID" unique="true" /> 
</class> 
  • Ich gehe davon aus, das ist wirklich eine Eins-zu-eins, daher die unique.
  • Sie sollten jede Spalte einmal zuordnen. Wenn es sich um eine Beziehung handelt, handelt es sich nicht um eine Int-Eigenschaft.

Ein Verweis von tableB auf tableA würde umgesetzt werden:

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

Dies dokumentiert alle http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-onetoone

+0

Danke. Das hat funktioniert. Verwirrend, dass ich ein Many-to-One-Element verwenden muss, wenn es wirklich ein Eins-zu-eins-Mapping ist. Ich setze auch den Fetch-Typ auf "Join", um die Anzahl der Abfragen zu reduzieren. – MonkeyWrench

+0

Aber ja, wenn Sie ein bidirektionales Beispiel zeigen können, wäre es lehrreich. – MonkeyWrench

+0

Da gehen Sie ... –

0

Sie sollen nicht die Eigenschaft als eine Eigenschaft in Ihrer Mapping-Datei specifiy müssen, wenn Sie auch eine für den gleichen Wert Eins-zu-Eins-Beziehung definieren. Ich habe nicht eins-zu-eins verwendet, so kann es ein anderes Problem sein, aber ich würde die Zeile entfernen:

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

von tableA und sehen, ob das hilft.

+0

keinen Unterschied machen Haben, und ich weiß nicht, warum sollte es. Beide Tabellen haben diese Spalte, und beide Zuordnungen sollten kein Problem mit diesen Eigenschaften haben. – MonkeyWrench

+0

Einen Versuch wert. Ich habe einige seltsame Nebenwirkungen von solchen Sachen gefunden, also dachte ich, ich würde es da rausschmeißen. – Kendrick

Verwandte Themen