2009-01-30 14 views
19

Ho un problema. Immaginate questo modello di dati:nHibernate 2.0 - mappare un ID composito * e * una relazione molti-a-uno causa l'errore "indice non valido"

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

Dal [PersonTag] non è solo una semplice tabella molti-a-molti unirsi, ho tutti e tre i soggetti creati in NHibernate (esattamente come sono nel modello di dati). PersonTag, pertanto, ha bisogno di un composite-id, che ho mappato a una classe come questa:

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

voglio attraversare l'oggetto grafico ed essere in grado di guardare entrambe le Person e Tag oggetti da un recuperato PersonTag oggetto. Così, ho proprietà dell'oggetto PersonTag per farlo, mappato in questo modo:

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

Quando cerco di creare un oggetto PersonTag e salvarlo, ottengo un "indice n non valido per questo SqlParameterCollection con Count = n "Errore. Lo so perché ho mappato le proprietà PersonId e TagId due volte, una volta per l'ID composito e una volta per la relazione molti-a-uno. Se non mappo gli oggetti molti-a-uno, allora tutto funziona correttamente.

C'è un modo per me di essere in grado di avere un ID composito E una relazione molti-a-uno basata sulla stessa colonna modellata nella stessa entità ibernata?

+0

A proposito, ho appena incontrato il sottoelemento "chiave-molti-a-uno" in composito-id ... potrebbe essere che esso? –

risposta

27

Kay, ecco la risposta. Little-a-no documentazione su questo:

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

Questo vi permetterà di creare un composito-id formato da l'inverso di una relazione molti-a-uno.

Buona caccia ...

+0

Sei incazzato perché non ci sono praticamente documenti su questo! Potresti chiarire qualcosa per me un po '? Come erano le definizioni finali della classe? sono classe Persona {ISet PersonTags; } codice classe {ISet PersonTags; } class PersonTag {PersonTagKey Key; bool IsActive; } classe PersonTagKey {Person Person; Tag Tag; } – mcintyre321

+0

Hai capito! L'unica differenza era che stavo usando List , non ISet . Che finiscono per lavorare per te? –

+0

Molte grazie per averlo scoperto - l'ho solo speronato. Sembra che * tutto * sia richiesto per essere oggetti. FYI per i futuri utenti: è possibile aggiungere restrizioni ai criteri specificando il percorso completo ai valori degli oggetti secondari rilevanti: 'Restrictions.Eq (" PersonTagKey.Person.Id ", 123)' – Groxx