2012-05-23 6 views
15

Diese Ausnahme:Infamous: Ungültige Index n für diese SqlParameterCollection mit Count =

Ungültiger Index n für diese SqlParameterCollection mit Count =

Normalerweise verweist auf doppelte Zuordnungsinformationen (siehe Stack-Überlauf + Google). Ich bin mir ziemlich sicher, dass ich keine habe. Gibt es andere Gründe dafür?

Ich habe das Problem identifiziert. Ich stellte dies vor:

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

Um die Suche über lucene.net zu verwenden. Dies scheint FNH zu stören! Was sind meine Möglichkeiten hier?

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

Ich sagte, dass ich SO gegoogelt und gesucht habe (siehe Frage) !!!Es gibt keine HQL, da es sich um eine einfache Save() einer Entität über ein s # arp-Repository handelt. – cs0815

+0

Ich würde die vollständige Ausnahme (exception.ToString()) erneut posten und die relevante Zuordnung nur zur Sicherheit veröffentlichen. –

+0

Brauchen Sie die vollständige Zuordnung für die betreffende Entität zu sehen – Rippo

Antwort

41

Die Antwort ist entweder: -

a) Sie eine doppelte Eigenschaft in der gleichen Klasse zugeordnet haben

b) Es ist möglich, wenn Sie einen Fremdschlüssel offen legen, sowie eine <many-to-one ... für die zugehörige Berechtigung verwenden y in der Zuordnungsdatei. Wenn dies der Fall ist, fügen Sie der Fremdschlüsseleigenschaft hinzu und führen Sie sie erneut aus.

Um dies zu überprüfen, müssen Sie, da Sie fließend und automatisch arbeiten, die XML-Mappings betrachten. Sehen Sie [link] [2] und verwenden Sie ExportTo(..) Methode. Sobald Sie dies getan haben, betrachten Sie die XML und sehen Sie, ob Sie doppelte Eigenschaften haben ODER sogar doppelte Zuordnungsdateien.

In Ihrem Fall haben Sie zwei Verweise auf Spalte GI:

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

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

Ich nehme an, Sie können nicht die Anmerkung [DocumentId] auf der Id Klasse Eigenschaft festgelegt. Ich denke, dass Sie Auto Mapping für diese Klasse möglicherweise verlassen müssen und manuell fließend konfigurieren müssen!

+0

@bartoszKP aufgrund Ihrer Bearbeitung dieser liest jetzt nicht sehr gut :) – Rippo

+0

Sorry, für Ihren Beitrag verwirrend. Meine Absicht war es, eine vollständige Antwort ohne historischen Lärm zu machen. Es war hilfreich für mich, aber es war ein bisschen schwierig, durch alle PPS zu navigieren;) Wie ist es jetzt? Natürlich kannst du den Beitrag noch weiter verbessern, vor allem, wenn ich noch immer vermisse, was du in der Antwort sagen wolltest :) – BartoszKP

0

Ich hatte diesen Fehler wo ich in meiner Fluent IAutoMappingOverride Klasse hatte ich eine Zuordnung.IgnoreProperty (p => Eigenschaft), wo die Eigenschaft nur ein Getter war. Ich habe die IgnoreMap-Anweisung entfernt und sie behoben. Dies ist mit NH 3.3.1.4. Wahrscheinlich bezieht sich das nicht auf Ihr Problem, aber hoffentlich hilft das jemand anderem.

3

Mit vollem Kredit @Rippo, die äquivalente Antwort in Fluent NHibernate, die mir geholfen ist:

Für die Klassen:

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

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

Wenn Sie die folgende Abbildung für die User Einheit:

Das Folgende ist eine der möglichen Lösungen (aufgrund der doppelten Zuordnung im one-to-many Teil - 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