2017-03-27 48 views
0

加入我有兩個表,例如: FirstTable(firstID, field1), SecondTable(secondID, firstID, field2)NHibernate的內部非主鍵的XML映射

我有一個XML映射:

<class name="testClass" 
      table="SecondTable" 
      lazy="false"> 
    <id name="ID" column="secondID" type="Guid"> 
     <generator class="guid"/> 
    </id> 
    <property name="Field2" column="field2" type="string"/> 
    <join table="FirstTable"> 
     <key column="firstID"/> 
     <property name="Field1" column="field1"/> 
    </join> 
    </class> 

的問題是,作爲一個結果,我希望得到一個查詢關鍵詞,比如:

select * from SecondTable st 
inner join FirstTable ft on st.firstID = ft.firstID 

但現在查詢看起來像

select * from SecondTable st 
inner join FirstTable ft on st.secondID = ft.firstID 

是否有可能不加入主字段?

+0

看看這有助於:http://stackoverflow.com/questions/22900737/how-would-i-join-a-table-on-a-non-primary-key-field-using-nhibernate -mapping-byc –

+0

謝謝,我看到了這個主題,但並不明白我在這種情況下究竟能夠如何使用它 – Potato

回答

1

理想情況下,您應該尊重「密鑰」等相關字段以獲取您的相關數據。 但是,由於它們具有相同的值類型,因此您可以通過任何字段來連接表。

此外,您可以瞭解「連接」的工作方式,請參閱以下基本鏈接。 https://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg

您的代碼將是正確的,如果seconId是一個FK指着firstTable firstId列,也secondId可能是一個PK,所以你可以從secondTable刪除firstId列,但它會出最好的初步實踐的。看到這個 - https://ayende.com/blog/3961/nhibernate-mapping-join

所以代碼應該是這樣的,你的SecondTable應該有一個屬性指向firstID與另一個相關的類。我無法在這裏測試,我在工作。

<class name="SecondTable" 
      table="SecondTable" 
      lazy="false"> 
    <id name="secondID" type="Guid"> 
     <generator class="guid"/> 
    </id> 
    <property name="secondID" type="Guid" /> 
    <property name="field2" type="string"/> 
    <many-to-one name="firstID" column="firstID"/> 
</class> 
<class name="FirstTable"> 
    <id name="firstID" type="guid"> 
     <generator class="guid" /> 
    </id> 
    <property name="Field1" type="String" /> 
</class>