2010-10-06 85 views
9

無法讓NHibernate生成正確的查詢。它一直使用我加入一對一關係的兩個表的主鍵,我無法弄清楚如何在其中一個表中指定外鍵。NHibernate一對一映射,非主鍵

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

所以tableA應該使用tableA.bID = tableB.bID連接到tableB。我如何在tableA的映射中指定這個?我使用tableA類從tableA檢索一行,從tableB檢索一行,因爲它是一對一的關係。

NHibernate使用tableA.aID = tableB.bID生成sql連接表,這是錯誤的。

這不起作用:

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

回答

8

這是映射它的正確方法:

<class name="tableA" table="tableA"> 
    ... 
    <many-to-one name="otherThing" class="tableB" column="bID" unique="true" /> 
</class> 
  • 我假設這確實是一個對一個,因此unique
  • 您應該映射每列ONCE。如果它是一種關係,那麼它不是一個int屬性。

從tableB的到表A的引用可以被實現爲:

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

這一切都是在http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-onetoone

+0

謝謝。這工作。令人困惑的是,當它真的是一對一的映射時,我不得不使用多對一的元素。我還將獲取類型設置爲「連接」,以減少查詢次數。 – MonkeyWrench 2010-10-06 15:28:38

+0

但是,是的,如果你能展示一個雙向的例子,那將是教育性的。 – MonkeyWrench 2010-10-06 15:29:15

+0

你走了... – 2010-10-06 16:02:08

0

你不應該需要,當你還定義了相同值的一到一個關係到specifiy財產作爲財產在你的映射文件。我沒有用一個對一個,所以有可能是另外一個問題,但我會刪除行:從表A

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

,看看有沒有什麼幫助。

+0

記錄沒有做出區別,我不知道爲什麼會。這兩個表都有這個列,並且這兩個映射都應該沒有問題。 – MonkeyWrench 2010-10-06 15:06:45

+0

值得一試。我發現了這樣的東西的一些奇怪的副作用,所以我想我會把它扔出去。 – Kendrick 2010-10-06 15:24:15