2009-03-02 7 views
2

Je le modèle d'objet suivant:NHibernate des problèmes de cartographie

  • Un haut niveau classe abstraite Element avec beaucoup d'enfants et descendants.
  • Une classe Event.
  • Chaque Element contient un sachet de Event s.
  • Chaque Event a un pointeur vers le parent Element.

Jusqu'à maintenant - jolie relation one-to-many standart. Mais, je veux utiliser la table par stratégie de classe concrète. Ainsi, la classe Element n'est pas mappée à la base de données. J'ai essayé de le résoudre de cette façon: chacun des descendants concrets de Element définit son propre sac de Event s. Le problème avec ceci est que chaque élément <bag> contient un élément <key>. Cette clé pointe vers la propriété Parent de Event. Il fait également la colonne Parent dans la table Event une clé étrangère à la table qui contient le sac! Mais une colonne ne peut pas être une clé étrangère à plusieurs tables et je reçois une exception sur l'insertion.

J'ai également essayé de transformer le champ Parent dans la table Event en un type de champ unique. Ça a marché. Mais quand je veux faire la relation bidirectionnelle, c'est-à-dire, ajouter les sacs aux descendants de Element je reviens au même problème. Bag => clé étrangère => exception à l'insertion. Je suis sûr que ce cas n'est pas aussi unique que cela puisse paraître. Merci d'avance pour votre aide.

Répondre

1

Un peu en retard, mais j'ai quelques conseils.

Si vous utilisez "table per concrete class", c'est comme si vous utilisiez des tables complètement indépendantes. Vous avez donc besoin de clés étrangères séparées ou de plusieurs clés. Many-to-any stocke le nom du type et NH sait où pointe la clé étrangère. Mais il est impossible d'avoir des contraintes sur une telle clé étrangère.

Si vous avez plusieurs sacs ayant des éléments du même type, assurez-vous qu'ils définissent toutes différentes clés étrangères:

<class name="A"> 
    <!-- ... --> 
    <bag name="Events"> 
    <key column="A_FK"/> 
    <one-to-many class="Event"/> 
    </bag> 
</class> 

<class name="B"> 
    <!-- ... --> 
    <bag name="Events"> 
    <key column="B_FK"/> 
    <one-to-many class="Event"/> 
    </bag> 
</class> 

Vous pouvez avoir les clés étrangères sur une telle clé étrangère, mais contrainte ne pas nul , car seule l'une de ces clés étrangères est utilisée.

Pour n'avoir qu'une seule clé étrangère avec toutes les contraintes, vous devez mapper l'élément sur une table distincte.

Questions connexes