Печально известный: недопустимый индекс n для этой коллекции SqlParameterCollection с Count=

Это исключение:

недопустимый индекс n для этой коллекции SqlParameterCollection с Count=

обычно указывает на дублирующуюся картографическую информацию (см. Stack Overflow + Google). Я уверен, что у меня их нет. Есть ли другие причины?

кажется, я определил проблему. Я представил это:

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

использовать поиск через lucene.net - ... Это, кажется, мешает FNH! Какие у меня варианты здесь?

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:UsersblaDocumentsVisual Studio 2010ProjectsBlaUpdater1Program.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");
        }
    }

3 ответов


ответ:-

a) у вас есть повторяющееся свойство, отображаемое в том же классе

b) это возможно, если вы подвергаете внешний ключ, а также с помощью <many-to-one ... к связанной сущности в файле сопоставления. Если добавить insert="false" and update="false" к свойству внешнего ключа и запустите снова.

чтобы проверить это, поскольку вы используете fluent и automapping, вам нужно посмотреть на сопоставления XML. Видите эту [Ссылка][2] и использовать ExportTo(..) метод. Как только вы сделано это посмотрите на XML и посмотреть, есть ли у вас какие-либо повторяющиеся свойства или даже дубликаты файлов сопоставления.

в вашем случае у вас есть две ссылки на столбец GI:

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

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

Я так понимаю, вы не можете установить аннотации [DocumentId] на Id свойства класса. Я думаю, вам может потребоваться отказаться от автоматического сопоставления для этого класса и настроить с помощью fluent вручную!


С полным кредитом @Rippo, эквивалентный ответ на беглом NHibernate, который помог мне:

для классов:

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

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

если у вас есть следующее сопоставление для User сущности:

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

следующее является одним из возможных решений (из-за двойного отображения в 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

У меня была эта ошибка, когда в моем классе Fluent IAutoMappingOverride у меня было сопоставление.IgnoreProperty (P => свойство), где свойство было только геттером. Я удалил оператор IgnoreMap, и он исправил его. Это касается NH 3.3.1.4. Вероятно, это не относится к вашей проблеме, но, надеюсь, это поможет кому-то другому.