J'utilise la stratégie de table par sous-classe pour l'héritage dans mon application, comme décrit dans la publication Ayende here.Nhibernate critères de table-par-sous-classe sur l'ID de sous-classe utilise la colonne clé dans la table parente
Cependant, lorsque j'interroge spécifiquement une sous-classe, disons Company, et que je filtre sur l'Id (que je connais), le SQL résultant est incorrect et me donne une erreur dans SQL Server. Les critères:
session.CreateCriteria<Company>()
.Add(Expression.Eq("Id", 25)
.List<Company>();
Le résultat généré SQL:
SELECT this_.PartyId,
this_.CompanyName
FROM Companies this_
inner join Parties this_1_
on this_PartyId = this_1_.Id
WHERE this_1_.PartyId = 25
Le problème (dernière ligne - PartyId n'est pas défini sur la table des Parties) est que la colonne de clé dans la table des enfants est utilisé dans la table parent. Puisque le "Id" dérive de la classe Party en C#, cela a du sens. Mais pourquoi utilise-t-il la colonne clé "PartyId" au lieu de l'Id "Id" défini dans le mapping de Party? Et comment puis-je le faire fonctionner?
Merci!
Edit: Comme demandé, voici les correspondances (mêmes que ceux du billet de blog)
<class name="Party"
abstract="true"
table="Parties">
<id name="Id">
<generator class="identity"/>
</id>
<joined-subclass
table="People"
name="Person">
<key column="PartyId"/>
<property name="FirstName"/>
</joined-subclass>
<joined-subclass
table="Companies"
name="Company">
<key column="PartyId"/>
<property name="CompanyName"/>
</joined-subclass>
pouvez-vous poster votre carte de fête? – Rippo