2009-01-30 8 views
19

Tengo un problema. Imagínese este modelo de datos:nHibernate 2.0 - asociar una relación de identificación compuesta * y * de varios a uno provoca un error de "índice no válido"

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

Desde [PersonTag] no es sólo una simple tabla de muchos a muchos se unen, tengo las tres entidades creadas en NHibernate (exactamente como si estuvieran en el modelo de datos). PersonTag, por lo tanto, necesita un composite-id, que he asignado a una clase como esta:

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

Quiero atravesar el gráfico de objetos y ser capaz de mirar a ambos los Person y Tag objetos de una recuperada PersonTag objeto. Por lo tanto, no tengo propiedades en el objeto PersonTag de hacer eso, asignada como esto:

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

Cuando trato de crear un objeto PersonTag y guardarlo, me sale un "índice n no válida para este SqlParameterCollection con Count = n " error. Sé que esto se debe a que he mapeado las propiedades PersonId y TagId dos veces, una para la identificación compuesta y una para la relación de varios a uno. Si no mapeo los objetos muchos a uno, todo funciona bien.

¿Hay alguna manera de que pueda tener una relación de identificación compuesta Y una relación de varios a uno basada en la misma columna modelada en la misma entidad nHibernate?

+0

Por cierto, me encontré con el sub-elemento "clave de muchos a uno" en composite-id ... podría ser eso? –

Respuesta

27

Kay, aquí está la respuesta. Poca o ninguna documentación sobre esto:

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

Esto le permitirá crear un composite-id formado por la inversa de una relación muchos-a-uno.

Buena caza ...

+0

¡Estás sorprendido de que casi no hay documentación sobre esto! ¿Podrías aclararme algo un poco? ¿Cómo fueron las definiciones finales de clase? son ellos clase Persona {ISet PersonTags; } class Tag {ISet PersonTags; } clase PersonTag {Clave de PersonTagKey; bool IsActive; } clase PersonTagKey {Person Person; Tag Tag; } – mcintyre321

+0

¡Lo tienes! La única diferencia fue que estaba usando la lista , no ISet . ¿Eso terminó trabajando para ti? –

+0

Muchas gracias por descubrir esto, simplemente me metí de cabeza en ello. Parece que * todo * se requiere que sean objetos. FYI para buscadores futuros: puede agregar restricciones de criterio especificando la ruta completa a los valores de subobjeto relevantes: 'Restrictions.Eq (" PersonTagKey.Person.Id ", 123)' – Groxx

Cuestiones relacionadas