Tengo una entidad bastante compleja que no se guardará cuando a una tabla de base de datos particular le falte un registro. Cuando existe el registro, la entidad guarda correctamente. Cuando el registro no tiene que recibir la excepción:Índice N no válido para este SqlParameterCollection con Count = N solo cuando la tabla asociada tiene un registro nulo
índice inválido N para este SqlParameterCollection con Count = N
Después de leer un montón de soluciones encontradas a través de Google y las preguntas más estrechamente relacionados sobre desbordamiento de pila :
- What's causing “Invalid index nn for this SqlParameterCollection with Count=nn” when a column is Null in the database?
- Invalid Index n for this SqlParameterCollection with Count=n” OR “foreign key cannot be null
Creo que mi problema tiene que ver con la forma en que configuro mis archivos de mapeo. La entidad Cliente tiene referencia a la entidad Persona. La persona se asigna a una tabla que hemos leído, pero no tiene acceso de escritura. Cuando no existe un registro para la entidad Person, genero la excepción. Si el registro existe, no hay problema. Establecí la referencia a Persona del cliente en Nullable()
. También he verificado dos veces para asegurarme de que no tengo una propiedad mapeada dos veces desde ninguna de las entidades.
Esto es lo que siento es la información de asignación pertinente, pero le puede dar más, según sea necesario:
cliente
//more mapping code...
References(x => x.Person, "snl_id").Nullable();
//more mapping code...
persona
//more mapping code...
ReadOnly();
Id(x => x.SnlId).Column("SNL_ID");
//more mapping code...
Para complicar aún más las cosas tenemos un código doloroso para que NHibernate funcione mejor cuando no existe. No estoy seguro de que se aplique aquí, pero pensé que era lo suficientemente pertinente como para incluir en mi pregunta. Estamos utilizando el siguiente código porque sin él NHibernate JIRA creará toneladas de consultas. Esta solución se describe en este Stack Overflow answer.
propiedad del cliente persona
public virtual Person Person
{
get
{
try
{
var snlId = per.Name;
return per;
}
catch
{
return null;
}
}
set
{
per = value;
}
}
private EPerson per;
Qué me estoy perdiendo en mis asignaciones que causaría esta excepción? ¿Hay otra pieza de este problema que no estoy viendo?