Infamous: неверный индекс n для этого SqlParameterCollection с Count =
Это исключение:
Недействительный индекс n для этого SqlParameterCollection с Count =
Обычно указывает на дублируемую информацию сопоставления (см. "Переполнение стека + 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:\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
Ответ: -
a) у вас есть дублирующее свойство, отображаемое в том же классе
b) Возможно, вы подвергаете внешний ключ, а также используя <many-to-one ...
для связанного объекта в файле сопоставления. Если это так, добавьте insert="false" and update="false"
в свойство внешнего ключа и запустите снова.
Чтобы убедиться в этом, поскольку вы используете свободное и автоматическое форматирование, вам нужно посмотреть на сопоставления XML. См. [Link] [2] и используйте метод ExportTo(..)
. После этого просмотрите XML
и посмотрите, есть ли у вас какие-либо повторяющиеся свойства или даже дублируются файлы сопоставления.
В этом случае у вас есть две ссылки на столбец GI
:
<id name="Id" ...>
<column name="GI" />
<generator class="assigned" />
</id>
<property name="GI" ...>
<column name="GI" />
</property>
Я так понимаю, вы не можете установить аннотацию [DocumentId]
в свойстве класса Id
. Я думаю, вам, возможно, придется отказаться от автоматического сопоставления для этого класса и настроить с помощью плавного ручного управления!
Ответ 2
С полным доверием к @Rippo эквивалентный ответ в Fluent 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
Ответ 3
У меня была эта ошибка, когда в моем классе Fluent IAutoMappingOverride у меня было mapping.IgnoreProperty(p = > Свойство), где Property было только получателем. Я удалил оператор IgnoreMap и исправил его. Это с NH 3.3.1.4. Вероятно, это не относится к вашей проблеме, но, надеюсь, это поможет кому-то другому.