2009-01-30 18 views
19

J'ai un problème. Imaginez ce modèle de données:nHibernate 2.0 - mappage d'une relation composite-id * et * many-to-one provoque une erreur "index invalide"

[Person] table has: PersonId, Name1 
[Tag] table has: TagId, TagDescription 
[PersonTag] has: PersonId, TagId, IsActive 

Depuis [PersonTag] est pas un simple many-to-many table de jointure, j'ai les trois entités créées dans NHibernate (exactement comme ils sont dans le modèle de données). PersonTag donc, a besoin d'un composite id, que je l'ai mis en correspondance avec une classe comme ceci:

<composite-id name="PersonTagKey" class="PersonTagKey"> 
    <key-property name="PersonId"></key-property> 
    <key-property name="TagId"></key-property> 
</composite-id> 

Je veux traverser le graphe d'objets et être en mesure de regarder les deux objets de Person et Tag un extrait PersonTag objet. Donc, j'ai propriétés sur l'objet PersonTag de le faire, cartographié comme ceci:

<many-to-one name="Person" column="PersonId" lazy="proxy" cascade="none" class="Person"/> 
<many-to-one name="Tag" column="TagId" lazy="proxy" cascade="none" class="Tag"/> 

Lorsque je tente de créer un objet PersonTag et enregistrez-le, je reçois un « index non valide n pour cette SqlParameterCollection avec Count = n " erreur. Je sais que c'est parce que j'ai mappé deux fois les propriétés PersonId et TagId, une fois pour l'ID composite et une fois pour la relation plusieurs-un. Si je ne cartographie pas les objets many-to-one, alors tout fonctionne bien.

Existe-t-il un moyen pour moi d'avoir un composite-id ET une relation many-to-one basée sur la même colonne modélisée dans la même entité nHibernate?

+0

BTW, je viens suis tombé sur le "key-many-to-one" en sous-élément composite id ... pourrait-il que ce soit? –

Répondre

27

Kay, voici la réponse. Peu à aucune documentation sur ce point:

<composite-id name="PersonTagKey" class="PersonTagKey"> 
    <key-many-to-one name="Person" column="PersonId" lazy="proxy" class="Person"> 
    <key-many-to-one name="Tag" column="TagId" lazy="proxy" class="Tag"/> 
</composite-id> 

Cela vous permettra de créer un composite id composé de l'inverse d'un grand nombre à une relation.

Bonne chasse ...

+0

Vous êtes sur le point d'y avoir pratiquement aucune documentation à ce sujet! Pourriez-vous clarifier quelque chose pour moi un peu? Quelles étaient les définitions finales de la classe? sont-ils class Person {ISet PersonTags; } classe Tag {ISet PersonTags; } class PersonTag {PersonTagKey Clé; bool IsActive; } class PersonTagKey {Personne Personne; Balise d'étiquette; } – mcintyre321

+0

Vous l'avez! La seule différence était que j'utilisais la liste , pas ISet . Cela finit par travailler pour vous? –

+0

Beaucoup de mercis pour avoir découvert cela - je me suis précipité dedans. Il semble que * tout * soit requis pour être des objets. FYI pour les futurs chercheurs: vous pouvez ajouter des restrictions de critère en spécifiant le chemin complet vers les valeurs de sous-objet pertinentes: 'Restrictions.Eq (" PersonTagKey.Person.Id ", 123)' – Groxx

Questions connexes