臭名昭着:这个SqlParameterCollection的索引n无效,Count =

时间:2012-05-23 10:35:56

标签: hibernate nhibernate lucene.net

此例外:

此SqlParameterCollection的索引n无效,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:\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");
        }
    }

3 个答案:

答案 0 :(得分:47)

答案是: -

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。我想你可能需要放弃这个类的自动映射,并通过手动配置!

答案 1 :(得分:4)

完全归功于@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

答案 2 :(得分:0)

我有这个错误,在我的Fluent IAutoMappingOverride类中,我有一个mapping.IgnoreProperty(p =&gt; Property),其中Property只是一个getter。我删除了IgnoreMap语句并修复了它。这是NH 3.3.1.4。可能与您的问题无关,但希望这会帮助其他人。