IndexOutOfRangeException 深入 NHibernate [英] IndexOutOfRangeException Deep in the bowels of NHibernate

查看:17
本文介绍了IndexOutOfRangeException 深入 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");
        }       
    }

当我尝试运行此测试时:

When I attempt to run this test:

[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();
    }
}

我在 NHibernate 内部得到以下错误:

I get the following error deep in the bowels of NHibernate:

执行System.IndexOutOfRangeException: 为此无效的索引 6Count=6 的 SqlParameterCollection.在 System.Data.SqlClient.SqlParameterCollection.RangeCheck(Int32指数)在 System.Data.SqlClient.SqlParameterCollection.GetParameter(Int32指数)在 System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item(Int32指数)s:NHibernateNHibernatesrcNHibernateTypeDateTimeType.cs(65,0):在NHibernate.Type.DateTimeType.Set(IDbCommandst,对象值,Int32 索引)s:NHibernateNHibernatesrcNHibernateTypeNullableType.cs(180,0):在NHibernate.Type.NullableType.NullSafeSet(IDbCommandcmd、对象值、Int32 索引)s:NHibernateNHibernatesrcNHibernateTypeNullableType.cs(139,0):在NHibernate.Type.NullableType.NullSafeSet(IDbCommandst,对象值,Int32 索引,ISessionImplementor 会话)s:NHibernateNHibernatesrcNHibernateTypeComponentType.cs(213,0):在NHibernate.Type.ComponentType.NullSafeSet(IDbCommandst, 对象值, Int32 开始,ISessionImplementor 会话)s:NHibernateNHibernatesrcNHibernatePersisterEntityAbstractEntityPersister.cs(2393,0):在NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(对象id、Object[] 字段、Object rowId、布尔[]包含属性,布尔[][]包括列,Int32 表,IDbCommand 语句,ISessionImplementor 会话,Int32指数)s:NHibernateNHibernatesrcNHibernatePersisterEntityAbstractEntityPersister.cs(2754,0):在NHibernate.Persister.Entity.AbstractEntityPersister.Update(对象id、Object[] 字段、Object[]oldFields, 对象 rowId, Boolean[]包含属性、Int32 j、对象旧版本、对象对象、SqlCommandInfosql、ISessionImplementor 会话)s:NHibernateNHibernatesrcNHibernatePersisterEntityAbstractEntityPersister.cs(2666,0):在NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(对象id、Object[] 字段、Object[]oldFields, 对象 rowId, Boolean[]包含属性、Int32 j、对象旧版本、对象对象、SqlCommandInfosql、ISessionImplementor 会话)s:NHibernateNHibernatesrcNHibernatePersisterEntityAbstractEntityPersister.cs(2940,0):在NHibernate.Persister.Entity.AbstractEntityPersister.Update(对象id、Object[] 字段、Int32[]脏字段,布尔值hasDirtyCollection, 对象[]oldFields,对象 oldVersion,对象obj, 对象 rowId, ISessionImplementor会议)s:NHibernateNHibernatesrcNHibernateActionEntityUpdateAction.cs(78,0):在NHibernate.Action.EntityUpdateAction.Execute()s:NHibernateNHibernatesrcNHibernateEngineActionQueue.cs(130,0):在NHibernate.Engine.ActionQueue.Execute(IExecutable可执行)s:NHibernateNHibernatesrcNHibernateEngineActionQueue.cs(113,0):在NHibernate.Engine.ActionQueue.ExecuteActions(IList列表)s:NHibernateNHibernatesrcNHibernateEngineActionQueue.cs(147,0):在NHibernate.Engine.ActionQueue.ExecuteActions()s:NHibernateNHibernatesrcNHibernateEventDefaultAbstractFlushingEventListener.cs(241,0):在NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource会议)s:NHibernateNHibernatesrcNHibernateEventDefaultDefaultFlushEventListener.cs(19,0):在NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent事件)s:NHibernateNHibernatesrcNHibernateImplSessionImpl.cs(1478,0):在 NHibernate.Impl.SessionImpl.Flush()s:NHibernateNHibernatesrcNHibernateTransactionAdoTransaction.cs(187,0):在NHibernate.Transaction.AdoTransaction.Commit()在 lambda_method(ExecutionScope, ITransaction)

Execute System.IndexOutOfRangeException: Invalid index 6 for this SqlParameterCollection with Count=6. 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) s:NHibernateNHibernatesrcNHibernateTypeDateTimeType.cs(65,0): at NHibernate.Type.DateTimeType.Set(IDbCommand st, Object value, Int32 index) s:NHibernateNHibernatesrcNHibernateTypeNullableType.cs(180,0): at NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index) s:NHibernateNHibernatesrcNHibernateTypeNullableType.cs(139,0): at NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object value, Int32 index, ISessionImplementor session) s:NHibernateNHibernatesrcNHibernateTypeComponentType.cs(213,0): at NHibernate.Type.ComponentType.NullSafeSet(IDbCommand st, Object value, Int32 begin, ISessionImplementor session) s:NHibernateNHibernatesrcNHibernatePersisterEntityAbstractEntityPersister.cs(2393,0): at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index) s:NHibernateNHibernatesrcNHibernatePersisterEntityAbstractEntityPersister.cs(2754,0): at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) s:NHibernateNHibernatesrcNHibernatePersisterEntityAbstractEntityPersister.cs(2666,0): at NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) s:NHibernateNHibernatesrcNHibernatePersisterEntityAbstractEntityPersister.cs(2940,0): at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session) s:NHibernateNHibernatesrcNHibernateActionEntityUpdateAction.cs(78,0): at NHibernate.Action.EntityUpdateAction.Execute() s:NHibernateNHibernatesrcNHibernateEngineActionQueue.cs(130,0): at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) s:NHibernateNHibernatesrcNHibernateEngineActionQueue.cs(113,0): at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) s:NHibernateNHibernatesrcNHibernateEngineActionQueue.cs(147,0): at NHibernate.Engine.ActionQueue.ExecuteActions() s:NHibernateNHibernatesrcNHibernateEventDefaultAbstractFlushingEventListener.cs(241,0): at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) s:NHibernateNHibernatesrcNHibernateEventDefaultDefaultFlushEventListener.cs(19,0): at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) s:NHibernateNHibernatesrcNHibernateImplSessionImpl.cs(1478,0): at NHibernate.Impl.SessionImpl.Flush() s:NHibernateNHibernatesrcNHibernateTransactionAdoTransaction.cs(187,0): at NHibernate.Transaction.AdoTransaction.Commit() at lambda_method(ExecutionScope , ITransaction )

现在有趣的是,如果我在 SecurityMap 中注释掉对 Company 或 PrimaryListing 的引用,我不会收到错误消息.我注释掉哪个似乎无关紧要.只有当我同时拥有两者时才会发生错误.

Now the interesting thing is if I comment out the reference to Company or PrimaryListing in the SecurityMap, I don't get the error. It doesn't seem to matter which I comment out. The error only happens when I have both.

当更新真正通过 NHProf 时,我会看到这个更新:

When the update actually goes through NHProf shows me this update:

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 */

我不确定它为什么要更新 CompanyId 和 EndDate,但我怀疑它是相关的.

I am not sure why it is updating CompanyId and EndDate, but I suspect it is related.

有人有想法吗?将不胜感激.

Any one have ideas? Work arounds would be greatly appreciated.

推荐答案

是的,这是一个常见问题,您在映射定义中两次使用 Column "EndDate"(对于 Company 和 PrimaryListing)这是不允许的.其中一个必须去,或者有一个额外的 EndDate 列(每个关联一个)

Yes its a common problem, you are using the Column "EndDate" twice in your mapping definition (for both Company and PrimaryListing) and that is not allowed. One of them has to go, or have an additional EndDate column (one for each association)

也检查一下nHibernate 2.0 - 映射复合 ID * 和 * 多对一关系导致无效索引";错误

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

这篇关于IndexOutOfRangeException 深入 NHibernate的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆