hibernate - Infame: El índice n no válido para este SqlParameterCollection con Count=
nhibernate lucene.net (3)
Esta excepción:
El índice n no válido para este SqlParameterCollection con Count =
Generalmente apunta a información de mapeo duplicada (ver Desbordamiento de pila + Google). Estoy bastante seguro de que no tengo ninguno. ¿Hay alguna otra razón para ello?
Parece que he identificado el problema. Introduje esto:
[DocumentId]
public virtual int GI
{
get { return base.Id; }
protected set { base.Id = value; }
}
Para utilizar la búsqueda a través de lucene.net. ¡Esto parece interferir con FNH! ¿Cuáles son mis opciones aquí?
PD:
at System.Data.SqlClient.SqlParameterCollection.RangeCheck(Int32 index)
at System.Data.SqlClient.SqlParameterCollection.GetParameter(Int32 index)
at System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item(Int32 index)
at NHibernate.Type.Int32Type.Set(IDbCommand rs, Object value, Int32 index)
at NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index)
at NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object value, Int32 index, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index)
at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session)
at NHibernate.Action.EntityInsertAction.Execute()
at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
at NHibernate.Engine.ActionQueue.ExecuteActions()
at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)
at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)
at NHibernate.Impl.SessionImpl.Flush()
at SharpArch.Data.NHibernate.DbContext.CommitChanges()
at Updater1.Program.Main(String[] args) in C:/Users/bla/Documents/Visual Studio 2010/Projects/Bla/Updater1/Program.cs:line 97
PPS:
public class MappedSequenceMap : IAutoMappingOverride<MappedSequence>
{
public void Override(AutoMapping<MappedSequence> mapping)
{
mapping.Id(x => x.Id, "GI").GeneratedBy.Assigned();
mapping.Map(x => x.Affiliation).Length(10000);
mapping.Map(x => x.Gene).Length(10000);
mapping.Map(x => x.OriginalIsolationCountry).Length(10000);
mapping.Map(x => x.OriginalAffiliation).Length(10000);
mapping.Map(x => x.PMIDs).Length(10000);
mapping.Map(x => x.Product).Length(10000);
mapping.Map(x => x.Fasta).Length(10000);
mapping.Map(x => x.Note).Length(10000);
mapping.Map(x => x.Strain).Length(10000);
mapping.HasManyToMany(x => x.PubmedPublications).Table("SequencesPubmedPublications");
}
}
Con crédito completo para @Rippo, la respuesta equivalente en Fluent NHibernate que me ayudó fue:
Para las clases:
public class User
{
public virtual Department {get; set;}
}
public class Department
{
public virtual ICollection<User> Users {get; set;}
}
Si tiene la siguiente asignación para la entidad User
:
//Problem mapping
Map(x => x.DepartmentId)
References(x => x.Department)
.Column("Id")
.ForeignKey("DepartmentId")
.Fetch.Join();
La siguiente es una de las posibles soluciones (debido al doble mapeo en la parte one-to-many
: one-Department-to-many-Users
):
// !Solution
Map(x => x.DepartmentId)
References(x => x.Department)
.Column("Id")
.ForeignKey("DepartmentId")
.Fetch.Join()
.Not.Insert() // <- added this
.Not.Update(); // <- and this
La respuesta es:
a) tienes una propiedad duplicada asignada en la misma clase
b) Es posible si está exponiendo una clave foránea, así como utilizando una <many-to-one ...
a la entidad relacionada en el archivo de mapeo. Si este es el caso, agregue insert="false" and update="false"
a la propiedad de clave foránea y vuelva a ejecutar.
Para verificar esto, ya que está utilizando fluidez y automapping, debe mirar las asignaciones XML. Vea este [enlace] [2] y use el ExportTo(..)
. Una vez que haya hecho esto, observe el XML
y vea si tiene propiedades duplicadas O incluso archivos de mapeo duplicados.
En su caso, tiene dos referencias a la columna GI
:
<id name="Id" ...>
<column name="GI" />
<generator class="assigned" />
</id>
<property name="GI" ...>
<column name="GI" />
</property>
Supongo que no se puede establecer la anotación [DocumentId]
en la propiedad de clase Id
. ¡Creo que es posible que deba abandonar la asignación automática para esta clase y configurarla con fluidez manualmente!
Tuve este error donde en mi clase Fluent IAutoMappingOverride tenía un mapping.IgnoreProperty (p => Property) donde Property era solo un captador. Quité la instrucción IgnoreMap y la arreglé. Esto es con NH 3.3.1.4. Probablemente no se relacione con tu problema, pero espero que esto ayude a alguien más.