2009-01-30 4 views
19

Ich habe ein Problem. Stellen Sie sich dieses Datenmodell:nHibernate 2.0 - Zuordnung einer Composite-ID * und * viele-zu-eins-Beziehung verursacht "ungültiger Index" Fehler

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

Da [PersonTag] ist nicht nur ein einfacher many-to-many-Tisch sitzen, ich habe alle drei Einheiten in nHibernate erstellt (genau wie sie im Datenmodell sind). PersonTag muss deshalb ein Verbund-ID, die ich so zu einer Klasse zugeordnet haben:

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

Ich möchte das Objekt Diagramm zu durchqueren, und beide zu schauen in der Lage an den Person und Tag Objekte aus einer abgerufenen PersonTag Objekt. Also, ich habe Eigenschaften auf das PersonTag Objekt, das zu tun, wie dies abgebildet:

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

Wenn ich versuche, ein PersonTag Objekt zu erstellen und speichern, erhalte ich einen „Invalid Index n für diese SqlParameterCollection mit Count = n " Fehler. Ich weiß, das liegt daran, dass ich die Eigenschaften PersonId und TagId zweimal zugeordnet habe, einmal für die Composite-ID und einmal für die Viele-zu-Eins-Beziehung. Wenn ich die Viele-zu-Eins-Objekte nicht abbilde, funktioniert alles gut.

Gibt es eine Möglichkeit für mich, eine Composite-ID UND eine Viele-zu-Eins-Beziehung basierend auf derselben Spalte in derselben nHibernate-Entität modellieren zu können?

+0

BTW, ich kam gerade über die "key-many-to-one" Subelement in Composite-id ... könnte, dass es sein? –

Antwort

27

Kay, hier ist die Antwort. Little-to-keine Dokumentation zu diesem Thema:

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

Dies ermöglicht Ihnen, eine Verbund-ID aus der Umkehrung einer Viele-zu-Eins-Beziehung zu schaffen gemacht.

Gute Jagd ...

+0

Sie sagen, es gibt kaum eine Dokumentation darüber! Könntest du mir etwas etwas erklären? Wie waren die endgültigen Klassendefinitionen? sind sie Klasse Person {ISet PersonTags; } Klasse Tag {ISet PersonTags; } Klasse PersonTag {PersonTagKey Key; bool IsActive; } Klasse PersonTagKey {Person Person; Tag-Tag; } – mcintyre321

+0

Du hast es! Der einzige Unterschied war, dass ich die Liste , nicht ISet verwendete. Das funktioniert für dich? –

+0

Vielen vielen Dank, dass Sie das entdeckt haben - ich rammte mich einfach kopfüber hinein. Es sieht so aus als ob * alles * Objekte sein müssen. FYI für zukünftige Sucher: Sie können Kriterieneinschränkungen hinzufügen, indem Sie den vollständigen Pfad zu den relevanten Unterobjektwerten angeben: 'Restrictions.Eq (" PersonTagKey.Person.Id ", 123)' – Groxx