2011-02-03 35 views
27

He estado utilizando NHibernate con éxito desde hace bastante tiempo y he podido resolver muchos errores con una aplicación que desarrollado con él y que se está ejecutando en producción. Sin embargo, el reciente obstáculo me tiene realmente rascándome la cabeza."Índice n nulo para este SqlParameterCollection con Count = n" O "clave foránea no puede ser nulo"

Recientemente tuve que expandir la biblioteca de clases con algunas clases nuevas que están anidadas como secundarias para algunas clases ya existentes. Acabo de copiar el mismo modelo para el mapeo agregado que ya estaba usando con éxito , pero esta vez no funciona.

Ahora cuando se utiliza la siguiente en el archivo de asignación de los padres:

<bag name="SeaInfoItems" table="EDIImport_SeaInfo" lazy="false" cascade="save-update"> 
    <key column="EDI_FK_OWNERID"/> 
    <one-to-many class="FargoGate.AppLib.EdiImportSeaInfo, FargoGate.AppLib"/> 
    </bag> 

puedo elegir, en la clase del niño, ya sea para uso:

<property name="EDI_FK_OWNERID" column="EDI_FK_OWNERID" /> 

... lo que me da la infame "Índice inválido n para este SqlParameterCollection con Count = n" error.

O trato con esta solución que encontré después de algunas google:

<property name="EDI_FK_OWNERID" column="EDI_FK_OWNERID" insert="false" update="false" /> 

... lo que me un "No se puede insertar el valor NULL en la columna 'EDI_FK_OWNERID' ... la columna no permite valores nulos da " error.

Así que, básicamente, tengo que elegir entre la peste y el cólera.

Lo que no entiendo es que funciona perfectamente para las clases agregadas ya existentes, y realmente no puedo ver la diferencia. Lo único es que esta clave externa (EDI_FK_OWNERID) podría referirse a dos diferentes tablas principales. El diseño de la base de datos es malo, lo sé, pero no lo diseñé, y es mi tarea desarrollarlo para bien o para mal. No puedo cambiar el diseño de la base de datos.

La otra diferencia es que eliminé totalmente la referencia de clave foránea de las clases secundarias ya existentes (las asignaciones y los miembros de la clase). Traté de emular eso, por supuesto, pero fue en vano.

También descubrí que una de las nuevas clases (que es bastante pequeña) también funciona bien. Pero tampoco puedo ver cuál es la diferencia aquí. Estoy perplejo!

¿Alguien tiene una pista?

+1

en realidad el nulo índice n ... excepción que te ha llevado directamente a http: // stackoverflow.com/questions/2298026/indexoutofrangeexception-deep-in-the-bowels-of-nhibernate/2311256 # 2311256 – Jaguar

Respuesta

58

Aaargh! Me pusieron en una mala racha con este infame "Invalid Index n para este SqlParameterCollection with Count = n" error que pasé por alto lo obvio: un mapeo duplicado de un campo para UNA de las clases. En ese mapeo particular me dejó este error, donde la clave primaria también se define como una propiedad:

<id name="ID" column="ID"> 
    <generator class="guid" /> 
</id> 
<property name="ID" column="ID" /> 

Ahora que era una pérdida de tiempo tratar de depurar eso!

+0

+1 para señalar que podría ser un duplicado en UNA de las clases ... Ya había resuelto esto para el clase de padres ... se olvidó por completo de una clase de niños! – PJUK

+0

De acuerdo, esto ayudó a saber qué buscar. Gracias por compartir. – Nexxas

+0

Mucho después, pero gracias. También estoy trabajando con bases de datos heredadas, y ahora estoy trabajando con una tabla que tiene 45 columnas, y no tenía idea de qué estaba mal ... y bingo, se mapearon dos propiedades en la misma columna debido a un error tipográfico de copypasta . ¡Gracias! – CMPerez

Cuestiones relacionadas