2017-03-27 18 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>