2012-05-23 12 views
15

ngoại lệ này:Infamous: không hợp lệ chỉ số n cho SqlParameterCollection này với Count =

hợp lệ chỉ số n cho SqlParameterCollection này với Count =

Thường trỏ vào thông tin bản đồ trùng lặp (xem Stack Overflow + Google). Tôi khá chắc chắn tôi không có. Có lý do nào khác cho nó không?

Tôi dường như đã xác định được sự cố. Tôi đã giới thiệu điều này:

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

Để sử dụng tìm kiếm qua lucene.net. Điều này dường như can thiệp vào FNH! lựa chọn của tôi là gì đây?

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

Tôi đã nói rằng tôi đã tìm kiếm và tìm kiếm SO (xem câu hỏi) !!!Không có HQL nào liên quan vì nó là một Save() đơn giản của một thực thể thông qua một kho lưu trữ # sp. – cs0815

+0

Tôi sẽ đăng lại toàn bộ ngoại lệ (exception.ToString()) và đăng bản đồ có liên quan chỉ để chắc chắn. –

+0

Cần xem bản đồ đầy đủ cho thực thể đang được đề cập đến – Rippo

Trả lời

41

Câu trả lời là một trong hai: -

a) bạn có một tài sản trùng lặp ánh xạ trong cùng lớp

b) Có thể xảy ra nếu bạn đang lộ chìa khóa nước ngoài cũng như sử dụng <many-to-one ... cho quyền lợi liên quan y trong tệp ánh xạ. Nếu trường hợp này xảy ra, hãy thêm insert="false" and update="false" vào thuộc tính khóa ngoài và chạy lại.

Để xác minh điều này, vì bạn đang sử dụng lưu loát và tự động hóa, bạn cần xem xét ánh xạ XML. Xem [link] [2] này và sử dụng phương pháp ExportTo(..). Khi bạn đã thực hiện việc này, hãy xem XML và xem bạn có bất kỳ thuộc tính trùng lặp HOẶC thậm chí các tệp ánh xạ trùng lặp hay không.

Trong trường hợp bạn, bạn có hai tham chiếu đến cột GI:

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

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

Tôi mang nó bạn không thể đặt chú thích [DocumentId] trên tài sản Id lớp. Tôi nghĩ bạn có thể cần phải từ bỏ ánh xạ tự động cho lớp này và định cấu hình thông qua thủ công thành thạo!

+0

@bartoszKP do chỉnh sửa của bạn hiện không đọc tốt lắm :) – Rippo

+0

Xin lỗi, vì đã làm cho bài đăng của bạn khó hiểu. Mục đích của tôi là làm cho nó trở thành một câu trả lời hoàn chỉnh mà không có bất kỳ tiếng ồn lịch sử nào. Nó rất hữu ích cho tôi, nhưng có một chút khó khăn để điều hướng qua tất cả các PPS;) Bây giờ nó như thế nào? Tất nhiên cảm thấy tự do để cải thiện bài đăng nhiều hơn, đặc biệt là nếu tôi vẫn còn thiếu những gì bạn muốn nói trong câu trả lời :) – BartoszKP

0

Tôi đã gặp lỗi này khi ở trong lớp Fluent IAutoMappingOverride của tôi, tôi đã có ánh xạ.IgnoreProperty (p => Thuộc tính) trong đó Thuộc tính chỉ là bộ nạp. Tôi đã xóa câu lệnh IgnoreMap và nó đã sửa nó. Điều này là với NH 3.3.1.4. Có lẽ không liên quan đến vấn đề của bạn, nhưng hy vọng điều này sẽ giúp người khác.

3

Với tín dụng đầy đủ để @Rippo, câu trả lời tương đương trong thành thạo NHibernate đó đã giúp tôi là:

Đối với các lớp:

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

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

Nếu bạn có các bản đồ sau đây cho đơn vị User:

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

Sau đây là một trong các giải pháp khả thi (do ánh xạ kép trong phần 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