12

Tôi có ánh xạ sau:IndexOutOfRangeException sâu trong lòng của NHibernate

public class SecurityMap : ClassMap<Security> 
    { 
     public SecurityMap() 
     { 
      Table("Security"); 
      CompositeId().KeyProperty(k => k.Id, "SecurityId").KeyProperty(k => k.EndDate); 
      Map(x => x.LastUpdateUser); 
      References(x => x.Company).Columns("CompanyId", "EndDate"); 
      References(x => x.PrimaryListing).Columns("PrimaryListingId", "EndDate"); 
     } 
    } 

public class ListingMap : ClassMap<Listing> 
    { 
     public ListingMap() 
     { 
      Table("Listing"); 
      CompositeId().KeyProperty(k => k.Id, "ListingID").KeyProperty(k => k.EndDate); 
      References(x => x.Security).Columns("SecurityId","EndDate"); 
     } 
    } 

public class CompanyMap : ClassMap<Company> 
    { 
     public CompanyMap() 
     { 
      Table("Company"); 
      CompositeId().KeyProperty(k => k.Id, "CompanyID").KeyProperty(k => k.EndDate); 
      HasMany(x => x.Securities).KeyColumns.Add("CompanyId", "EndDate"); 
     }  
    } 

Khi tôi cố gắng để chạy thử nghiệm này:

[Test] 
public void can_update_a_security() 
{ 
    var repo = IoC.Resolve<ISecurityRepository>(); 
    int someSecurity = 1; 
    using (var work = IoC.Resolve<IUnitOfWorkManager>().Current) 
    { 
     Security security = repo.Get(someSecurity); 
     security.ShouldNotBeNull(); 
     security.LastUpdateUser = "Dirk Diggler" + DateTime.Now.Ticks; 
     repo.Save(security); 
     work.Commit(); 
    } 
} 

tôi nhận được lỗi sau sâu trong lòng của NHibernate:

Execute System.IndexOutOfRangeException: chỉ số không hợp lệ 6 chonày 10 SqlParameterCollection với Count = 6. tại System.Data.SqlClient.SqlParameterCollection.RangeCheck (Int32 index) tại System.Data.SqlClient.SqlParameterCollection.GetParameter (Int32 index) tại System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item (int32 index) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Loại \ DateTimeType.cs (65,0): tại NHibernate.Type.DateTimeType.Set (IDbCommand st, giá trị Object, chỉ số int32) s : \ NHibernate \ NHibernate \ src \ NHibernate \ Type \ NullableType.cs (180,0): tại NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd, Giá trị đối tượng, chỉ số Int32) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Loại \ NullableType.cs (139,0): tại NHibernate.Type.NullableType.NullSafeSet (IDbCommand st, giá trị Object, chỉ số Int32, ISessionImplementor phiên) s : \ NHibernate \ NHibernate \ src \ NHibernate \ Loại \ ComponentType.cs (213,0): tại NHibernate.Type.ComponentType.NullSafeSet (IDbCommand st, giá trị Object, Int32 bắt đầu, ISessionImplementor phiên) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Persister \ Entity \ AbstractEntityPersister.cs (2393,0): tại NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Object id, Object [] fields, O bject ROWID, Boolean [] includeProperty, Boolean [] [] includeColumns, Int32 bảng, tuyên bố IDbCommand, phiên ISessionImplementor, Int32 index) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Persister \ Entity \ AbstractEntityPersister. cs (2754,0): tại NHibernate.Persister.Entity.AbstractEntityPersister.Update (Object id, Object [] lĩnh vực, Object [] OLDFIELDS, Object ROWID, Boolean [] includeProperty, Int32 j, Object oldversion , Object obj, SqlCommandInfo sql, phiên ISessionImplementor) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Persister \ Entity \ AbstractEntityP ersister.cs (2666,0): tại NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert (Object id, Object [] lĩnh vực, Object [] OLDFIELDS, Object ROWID, Boolean [] includeProperty, Int32 j, Object oldversion, Object obj, SqlCommandInfo sql, phiên ISessionImplementor) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Persister \ Entity \ AbstractEntityPersister.cs (2940,0): tại NHibernate.Persister.Entity.AbstractEntityPersister.Cập nhật (Object id, Object [] lĩnh vực, Int32 [] dirtyFields, Boolean hasDirtyCollection, Object [] OLDFIELDS, Object oldversion, Object obj, Object ROWID, ISessionImplementor phiên) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Action \ EntityUpdateAction.cs (78,0): tại NHibernate.Action.EntityUpdateAction.Execute() s: \ NHibernate \ NHibernate \ src \ NHibernate \ Engine \ ActionQueue.cs (130,0): tại NHibernate.Engine.ActionQueue.Execute (IExecutable thực thi) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Engine \ ActionQueue.cs (113,0): tại NHibernate.Engine.ActionQueue.ExecuteActions (IList list) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Động cơ \ ActionQueue.cs (147,0): tại NHibernate.Engine.ActionQueue.ExecuteActions() s : \ NHibernate \ NHibernate \ src \ NHibernate \ Event \ Default \ AbstractFlushingEventListener.cs (241,0): tại NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (IEventSource phiên) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Event \ Default \ DefaultFlushEventListener.cs (19,0): tại NHibernate.Event.Default.DefaultFlushEventListener.OnFlush (FlushEvent sự kiện) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Impl \ SessionImpl.cs (1478,0): tại NHibernate.Impl.SessionImpl.Flush() s: \ NHibernate \ NHibernate \ src \ NHibernate \ Transaction \ AdoTransaction.cs (187,0): tại NHibernate.Transaction.AdoTransaction.Commit() tại lambda_method (ExecutionScope, ITransaction)

Bây giờ điều thú vị là nếu tôi nhận xét ra các tài liệu tham khảo cho Công ty hoặc PrimaryListing trong SecurityMap, I don' t nhận được lỗi. Nó không có vẻ quan trọng mà tôi bình luận. Lỗi chỉ xảy ra khi tôi có cả hai.

Khi bản cập nhật thực sự đi qua NHProf cho tôi thấy bản cập nhật này:

UPDATE Security 
SET LastUpdateUser = '2010-02-19T08:09:24.00' /* @p0 */, 
     CompanyId = 54199 /* @p1 */, 
     EndDate = '9999-12-31T00:00:00.00' /* @p2 */ 
WHERE SecurityId = 1 /* @p3 */ 
     AND EndDate = '9999-12-31T00:00:00.00' /* @p4 */ 

Tôi không chắc chắn lý do tại sao nó được cập nhật CompanyId và EndDate, nhưng tôi nghi ngờ nó là có liên quan.

Bất kỳ ai có ý tưởng? Làm việc xung quanh sẽ được đánh giá rất nhiều.

+0

hy vọng ai đó có thể thêm gợi ý cho cách giải quyết. – NotMyself

+0

Chỉ số nằm ngoài phạm vi. Phải không âm và nhỏ hơn kích thước của bộ sưu tập. –

Trả lời

30

Có vấn đề chung, bạn đang sử dụng Column "EndDate" hai lần trong định nghĩa ánh xạ của mình (cho cả Công ty và Danh sách chính) và điều đó không được phép. Một trong số đó phải đi, hoặc có một cột EndDate bổ sung (một cho mỗi hiệp hội)

việc kiểm tra này quá nHibernate 2.0 - mapping a composite-id *and* many-to-one relationship causes "invalid index" error

http://devlicio.us/blogs/derik_whittaker/archive/2009/03/19/nhibernate-and-invalid-index-n-for-this-sqlparametercollection-with-count-n-error.aspx

+2

Bạn có biết nếu điều này cuối cùng sẽ được sửa? Nó làm cho NH không thể sử dụng cho các kịch bản phức tạp hơn liên quan đến các bảng được phân đoạn ... –

+0

Có vẻ như đây vẫn là vấn đề ngay cả với NH 4.0 – leojh

+0

@LeoHernandez đây không phải là vấn đề.Đối với tất cả ý định và mục đích, nếu bạn muốn sử dụng một cột cho nhiều thuộc tính, thì bạn đang làm sai – Jaguar