2010-10-06 11 views
9

Impossibile ottenere NHibernate per generare la query corretta. Continua a utilizzare le chiavi primarie delle due tabelle a cui sto partecipando per la relazione uno a uno e non riesco a capire come specificare la chiave esterna in una delle tabelle.Mappatura uno-a-uno NHibernate, chiavi non primarie

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

in modo che la tabellaA debba unirsi alla tabellaB utilizzando tableA.bID = tableB.bID. Come posso specificarlo nella mappatura per tableA? Sto usando la classe tableA per recuperare una riga dalla tabellaA e una riga dalla tabellaB, in quanto si tratta di una relazione uno a uno reale.

NHibernate genera lo sql per unire le tabelle utilizzando tableA.aID = tableB.bID, che è errato.

Questo non funziona:

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

risposta

8

questo è il modo corretto di creare una mappa:

<class name="tableA" table="tableA"> 
    ... 
    <many-to-one name="otherThing" class="tableB" column="bID" unique="true" /> 
</class> 
  • Sto assumendo questo è davvero uno-a-uno, da qui il unique.
  • È necessario associare ciascuna colonna UNA VOLTA. Se si tratta di una relazione, quindi non è una proprietà int.

Un riferimento da tableB a tableA sarebbe implementato come:

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

Tutto questo è documentato in http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-onetoone

+0

Grazie. Ha funzionato. Confondendo che devo usare un elemento many-to-one quando è veramente un mapping one-to-one. Ho anche impostato il tipo di recupero su "join" in modo da ridurre il numero di query. – MonkeyWrench

+0

Ma sì, se puoi mostrare un esempio bidirezionale, sarebbe educativo. – MonkeyWrench

+0

Ecco qua ... –

0

Non dovrebbe essere necessario in modo da precisare la proprietà come una proprietà nel file di mapping quando si sta anche definendo una relazione uno-a-uno per lo stesso valore. Non ho usato uno-a-uno, quindi ci può essere un altro problema, ma mi piacerebbe rimuovere la riga:

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

da tableA e vedere se questo aiuta.

+0

Non fare la differenza, e non so il motivo per cui avrebbe fatto. Entrambe le tabelle hanno quella colonna, ed entrambe le mappature non dovrebbero avere problemi con queste proprietà. – MonkeyWrench

+0

Vale la pena sparare. Ho trovato alcuni strani effetti collaterali da cose del genere, quindi ho pensato di buttarlo là fuori. – Kendrick

Problemi correlati