2012-05-23 12 views
15

Questa eccezione:Infamous: non valido indice n per questo SqlParameterCollection con Count =

valido indice n per questo SqlParameterCollection con Count =

solito Indica informazioni di mappatura duplicate (vedi Stack Overflow + Google). Sono abbastanza sicuro di non averne. Ci sono altri motivi per questo?

Mi sembra di aver identificato il problema. Ho introdotto questo:

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

Per utilizzare la ricerca tramite lucene.net. Questo sembra interferire con FNH! quali sono le mie opzioni?

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

Ho detto che ho cercato su Google e cercato SO (vedi domanda) !!!Non è coinvolto HQL in quanto è un semplice Save() di un'entità tramite un repository s # arp. – cs0815

+0

Vorrei ri-pubblicare l'eccezione completa (exception.ToString()) e pubblicare la mappatura relativa solo per essere sicuro. –

+0

È necessario visualizzare il mapping completo per l'entità in questione – Rippo

risposta

41

La risposta può essere: -

a) si dispone di una proprietà duplicato mappato nella stessa classe

b) È possibile se si espone una chiave esterna e si utilizza un <many-to-one ... per il relativo comando y nel file di mappatura. Se questo è il caso aggiungi insert="false" and update="false" alla proprietà della chiave esterna ed esegui di nuovo.

Per verificare questo, come si sta utilizzando fluente e automapping, è necessario guardare ai mappature XML. Vedi questo [collegamento] [2] e usa il metodo ExportTo(..). Una volta che avete fatto questo sguardo al XML e vedere se avete proprietà duplicate o anche di duplicare file di mapping.

In te caso, si hanno due riferimenti a colonna GI:

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

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

lo prendo non è possibile impostare l'annotazione [DocumentId] sulla proprietà Id di classe. Penso che potrebbe essere necessario abbandonare la mappatura automatica per questa classe e configurare tramite fluente manualmente!

+0

@bartoszKP a causa della modifica che non si legge molto bene ora :) – Rippo

+0

Spiacente, per rendere confuso il post. Il mio intento era di renderlo una risposta completa senza alcun rumore storico. È stato utile per me, ma è stato un po 'difficile navigare attraverso tutti i PPS;) Come è ora? Ovviamente sentiti libero di migliorare ancora di più il post, soprattutto se mi manca ancora quello che volevi dire nella risposta :) – BartoszKP

0

Ho avuto questo errore in cui nella mia classe Fluent IAutoMappingOverride avevo un mapping.IgnoreProperty (p => Property) dove Property era solo un getter. Ho rimosso l'istruzione IgnoreMap e l'ho risolto. Questo è con NH 3.3.1.4. Probabilmente non si riferisce al tuo problema, ma spero che questo possa aiutare qualcun altro.

3

Con pieno credito al @Rippo, la risposta equivalente in Fluent NHibernate, che mi ha aiutato è:

Per le classi:

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

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

Se avete il seguente mapping per l'entità User:

//Problem mapping 
Map(x => x.DepartmentId)   
References(x => x.Department) 
    .Column("Id") 
    .ForeignKey("DepartmentId") 
    .Fetch.Join(); 

Ciò che segue è una delle possibili soluzioni (grazie alla doppia mappatura nella 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 
Problemi correlati