2010-12-14 89 views
0

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> 

+0

pouvez-vous poster votre carte de fête? – Rippo

Répondre

0

J'ai finalement trouvé le problème. je l'avais fait une erreur dans les applications (j'utilisais Fluent NHibernate pour me donner les correspondances que vous voyez ci-dessus) et je cartographié deux fois Id dans la classe Parti:

public class PartyMap : ClassMap<Party> 
{ 
    public PartyMap() 
    { 
     Table("Parties"); 
     Id(p => p.Id).GeneratedBy.Assigned(); 
     Map(p => p.Id); 
    } 
} 

Depuis « Id » a été mis en correspondance (non en tant qu'ID), lors de l'ajout d'une clause where à l'identifiant de l'entreprise, NHibernate était confus et utilisait la colonne clé "PartyId" comme colonne mappée pour "Id", assez confuse! La suppression du second mappage pour l'ID a résolu le problème.

Quoi qu'il en soit, mon erreur!