5

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 :

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?

Respuesta

2

Si bien la solución de Scott de eliminar la propiedad snl_id de la clase Cliente soluciona el problema, causa problemas que no puedo solucionar: snl_id puede existir en la tabla Cliente aunque no haya un registro correspondiente de la tabla Person. Dado que ese es el caso, hay momentos en que necesitaré acceso al snl_id cuando no puedo acceder a él a través de la propiedad de Persona asociada.

Consideré varias soluciones alternativas, pero me decidí a crear una vista de la tabla Cliente que incluye la clave principal de la tabla Cliente y snl_id de la tabla de clientes. Luego mapeando esa propiedad a través de una unión a la vista.

Join("v_cust_id_snl_id", j => j.KeyColumn("cust_id").Map(x => x.SnlId, "snl_id") 

Este cambio me permitió tener mi pastel y comérselo. Pude mantener la propiedad SnlId en el cliente, pero ya no arrojo la excepción al guardar.

1

¿Tiene el snl_id al que se hace referencia como propiedad en el Cliente además de ser la clave principal para el objeto secundario? Si es así, esto está causando el error que está recibiendo. Elimine la propiedad del Cliente y use Person para obtener el valor.

Cuestiones relacionadas