2012-05-23 17 views
15

Esta excepción:Historia de un crimen: no válida índice n para este SqlParameterCollection con Count =

no válida índice n para este SqlParameterCollection con Count =

Por lo general apunta a información de asignación duplicado (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. Presenté esto:

[DocumentId] 
public virtual int GI 
{ 
    get { return base.Id; } 
    protected set { base.Id = value; } 
} 

Para usar la búsqueda a través de lucene.net. ¡Esto parece interferir con FNH! ¿Cuáles son mis opciones aquí?

PS:

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"); 
     } 
    } 
+1

Dije que busqué en Google y SO (ver pregunta) !!!No hay HQL involucrado, ya que es un simple Guardar() de una entidad a través de un repositorio s # arp. – cs0815

+0

Volvería a publicar la excepción completa (exception.ToString()) y publicaría la asignación correspondiente solo para estar seguro. –

+0

Necesita ver el mapeo completo para la entidad en cuestión – Rippo

Respuesta

41

La respuesta es: - o bien

a) usted tiene una propiedad duplicado mapeado en la misma clase

b) Es posible si está exponiendo una clave externa así como usando un <many-to-one ... al entit relacionado y en el archivo de mapeo. Si este es el caso, agregue insert="false" and update="false" a la propiedad clave externa y vuelva a ejecutar.

Para verificar esto, ya que usa fluidez y automatización, necesita ver las asignaciones de XML. Vea este [enlace] [2] y use el método ExportTo(..). Una vez que haya hecho esto, mire el XML y vea si tiene propiedades duplicadas O incluso duplica los archivos de mapeo.

En caso de que usted, usted tiene dos referencias a la columna GI:

<id name="Id" ...> 
    <column name="GI" /> 
    <generator class="assigned" /> 
</id> 

<property name="GI" ...> 
    <column name="GI" /> 
</property> 

Debo entender que no se puede establecer la anotación [DocumentId] en la propiedad Id clase. ¡Creo que es posible que deba abandonar el mapeo automático para esta clase y configurar manualmente con fluidez!

+0

@bartoszKP debido a su edición, esto no se lee muy bien ahora :) – Rippo

+0

Lo siento, por hacer que su publicación sea confusa. Mi intención era convertirla en una respuesta completa sin ningún ruido histórico. Fue útil para mí, pero fue un poco difícil navegar a través de todos los PPS;) ¿Cómo es ahora? Por supuesto, siéntete libre de mejorar aún más la publicación, especialmente si aún me falta lo que querías decir en la respuesta :) – BartoszKP

0

Tuve este error cuando en mi clase Fluido IAutoMappingOverride tenía un mapping.IgnoreProperty (p => Property) donde Property era solo un getter. Eliminé la declaración IgnoreMap y la corrigió. Esto es con NH 3.3.1.4. Probablemente no se relaciona con su problema, pero con suerte esto ayudará a otra persona.

3

Con el crédito a @Rippo, la respuesta equivalente en Fluido NHibernate que me ayudó es:

Para las clases:

public class User 
{ 
    public virtual Department {get; set;} 
} 

public class Department 
{ 
    public virtual ICollection<User> Users {get; set;} 
} 

Si usted 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 a la doble asignación 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 
Cuestiones relacionadas