2010-10-06 8 views
9

Nie można pobrać NHibernate w celu wygenerowania poprawnego zapytania. Używa kluczy podstawowych dwóch tabel, do których się przyłączyłem, w związku jeden-do-jednego, i nie mogę wymyślić, jak określić klucz obcy w jednej z tabel.NHibernate mapowanie jeden-do-jednego, klucze podstawowe

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

, więc tabela A powinna dołączyć do tableB przy użyciu tableA.bID = tableB.bID. Jak mogę to określić w mapowaniu dla tableA? Korzystam z klasy tableA, aby pobrać wiersz z tabeli A i wiersz z tabeli B, ponieważ jest to relacja jeden do jednego.

NHibernate generuje sql do łączenia tabel przy użyciu tableA.aID = tableB.bID, co jest błędne.

To nie działa:

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

Odpowiedz

8

Jest to poprawny sposób go map:

<class name="tableA" table="tableA"> 
    ... 
    <many-to-one name="otherThing" class="tableB" column="bID" unique="true" /> 
</class> 
  • Jestem zakładając, to jest naprawdę jeden-na-jeden, stąd unique.
  • Powinieneś mapować każdą kolumnę RAZEM. Jeśli jest to relacja, nie jest to właściwość typu int.

Odwołanie od tableB do TABLEA byłyby realizowane jako:

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

To wszystko jest udokumentowane w http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-onetoone

+0

Dzięki. To się udało. Mylące, że muszę użyć elementu "jeden do jednego", gdy jest to naprawdę odwzorowanie jeden do jednego. Ustawię również typ pobierania, aby "dołączyć", aby zmniejszyć liczbę zapytań. – MonkeyWrench

+0

Ale tak, jeśli możesz pokazać przykład dwukierunkowy, byłoby to edukacyjne. – MonkeyWrench

+0

Proszę bardzo ... –

0

Nie ma potrzeby specifiy nieruchomości jako nieruchomości w pliku mapowania, gdy jesteś także zdefiniowanie relacji jeden-do-jeden dla tej samej wartości. I nie był używany jeden-na-jeden, więc nie może być inny problem, ale chcę usunąć linię:

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

z TABLEA i sprawdzić, czy to pomaga.

+0

Nie dokonać zmian, a ja nie wiem, dlaczego to zrobi. Obie tabele mają tę kolumnę i oba odwzorowania nie powinny mieć problemu z posiadaniem tych właściwości. – MonkeyWrench

+0

Warto strzelić. Znalazłem jakieś dziwne efekty uboczne z takich rzeczy, więc pomyślałem, że to wyrzucę. – Kendrick