2017-03-27 1 views
0

J'ai deux tables, par exemple: FirstTable(firstID, field1), SecondTable(secondID, firstID, field2)NHibernate jointure interne sur la cartographie xml clé non primaire

J'ai une cartographie 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> 

Le problème est que par conséquent je veux obtenir un requête comme:

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

mais maintenant requête ressemble

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

Est-il possible de rejoindre pas sur un champ primaire?

+0

Voir si cela aide: http://stackoverflow.com/questions/22900737/how-would-i-join-a-table-on-a-non-primary-key-field-using-nhibernate -mapping-byc –

+0

Merci, j'ai vu ce sujet, mais je n'ai pas compris comment exactement je peux l'utiliser dans cette situation – Potato

Répondre

1

Idéalement, vous devez respecter le domaine connexe comme "clés" pour obtenir vos données connexes. Mais vous pouvez joindre des tables par n'importe quel champ, car elles ont le même type de valeur.

En outre, vous pouvez comprendre comment 'joint' fonctionne en voyant le lien suivant pour les bases. https://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg

Votre code serait bon si seconId était un pointage FK à la colonne firstId sur firstTable, également secondId pourrait être un PK aussi, donc vous pouvez supprimer la colonne firstId du secondTable, mais il serait de la meilleure pratice . Voir ceci - https://ayende.com/blog/3961/nhibernate-mapping-join

Donc le code devrait être quelque chose comme ceci, où SecondTable devrait avoir une propriété pointant vers firstID ointo une autre classe à être liée. Je ne pouvais pas tester ici, je suis au travail.

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