2012-05-23 22 views
15

此異常:臭名昭著:無效指數n此SqlParameterCollection以計數=

無效指數n此SqlParameterCollection以計數=

在重複的映射信息通常指向(見堆棧溢出+谷歌)。我很確定我沒有。有沒有其他原因呢?

我似乎已經發現了這個問題。我介紹了這個:

[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

我說我用Google搜索和搜索(看問題)!!!沒有涉及HQL,因爲它是通過s#arp存儲庫實體的簡單Save()。 – cs0815

+0

我會重新發布完整的異常(exception.ToString()),併發布相關的映射只是爲了確保。 –

+0

由於您的編輯,需要查看有問題的實體 – Rippo

回答

41

答案可以是: -

a)您必須在同一類

b映射重複屬性)如果您正在公開外鍵並將<many-to-one ...用於相關授權y在映射文件中。如果是這種情況,將insert="false" and update="false"添加到外鍵屬性並再次運行。

要驗證這一點,當您使用流暢和自動映射時,您需要查看XML映射。請參閱此[鏈接] [2]並使用ExportTo(..)方法。完成此操作後,請查看XML並查看是否有任何重複屬性或甚至重複的映射文件。

在你的情況下,你有兩個引用GI柱:

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

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

我想你不能設置註釋[DocumentId]Id類屬性。我想你可能需要放棄這個類的自動映射,並手動配置通過流利!

+0

@bartoszKP的完整映射,現在看起來效果不佳:) – Rippo

+0

對不起,爲了讓您的帖子感到困惑。我的意圖是讓它成爲一個完整的答案,沒有任何歷史噪音。這對我很有幫助,但是要瀏覽所有的PPS是有點困難的;)現在怎麼樣?當然,可以隨意改善帖子,尤其是如果我仍然錯過了你想說的話:) – BartoszKP

0

我有這個錯誤,在我的Fluent IAutoMappingOverride類中,我有一個mapping.IgnoreProperty(p => Property),其中Property只是一個getter。我刪除了IgnoreMap語句,並修復了它。這與NH 3.3.1.4一致。可能與您的問題無關,但希望這可以幫助其他人。

3

有了充分肯定@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 
相關問題