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.
hy vọng ai đó có thể thêm gợi ý cho cách giải quyết. – NotMyself
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. –