添加新对象时,使用引用索引的FluentNhibernate映射超出范围

时间:2010-03-10 17:11:05

标签: nhibernate fluent-nhibernate

我正在尝试使用映射文件中的References映射FluentNHibernate中Person对象和Organization对象之间的父子关系,如下所示:

参考文献(x => x.Organization);

关系是Person对象,其中包含OrganizationId列,该列对应于Organization表中具有相应OrganizationId的记录。不同的人员记录可以属于同一个组织。

当我检索一个Person对象时,它可以正常工作。 Person.Organization已填充。我可以保存一个Person对象,它可以正常工作。但是,当我尝试添加一个新的Person对象时,我从NHibernate获得了一个Index Out of Range异常。调用session.SaveOrUpdate(person)时发生异常。我已经尝试将映射更改为:

参考文献(x => x.Organization).Cascade.None()

仍然得到同样的错误。我无法弄清楚导致异常的原因。完整的例外是:

System.IndexOutOfRangeException:此SqlParameterCollection的索引22无效,Count = 22。 在System.Data.SqlClient.SqlParameterCollection.RangeCheck(Int32索引) 在System.Data.SqlClient.SqlParameterCollection.GetParameter(Int32索引) at System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item(Int32 index) at NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd,Object value,Int32 index) at NHibernate.Type.ManyToOneType.NullSafeSet(IDbCommand st,Object value,Int32 index,Boolean [] settable,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) 在NHibernate.Persister.Entity.AbstractEntityPersister.GeneratedIdentifierBinder.BindValues(IDbCommand ps) 在NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL,ISessionImplementor session,IBinder binder) at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object [] fields,Boolean [] notNull,SqlCommandInfo sql,Object obj,ISessionImplementor session) at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object [] fields,Object obj,ISessionImplementor session) 在NHibernate.Action.EntityIdentityInsertAction.Execute() 在NHibernate.Engine.ActionQueue.Execute(IExecutable可执行文件) at NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity,EntityKey key,IEntityPersister persister,Boolean useIdentityColumn,Object anything,IEventSource source,Boolean requiresImmediateIdAccess) at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity,String entityName,Object anything,IEventSource source,Boolean requiresImmediateIdAccess) 在NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent事件) 在NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent事件) 在NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent事件) 在NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent事件) 在NHibernate.Impl.SessionImpl.SaveOrUpdate(Object obj)

1 个答案:

答案 0 :(得分:8)

首先发生异常是因为您在类中将同一列映射两次并且不允许。 检查一下 IndexOutOfRangeException Deep in the bowels of NHibernate

其次(并根据您的最新评论)在您的Person类中具有OrganizationId和Organization属性是对抗粒度的。你不需要它。您可以通过per1.Organization.Id

访问它

如果您的数据库中已有一个组织(比如Id = 5),并且使用OrganizationId外键将Organization类映射到Person类,那么当您编写代码时

Organization theOrganizationWithId5 = nhSession.Get<Organization>(5);
per1.Organization = theOrganizationWithId5;
nhSession.Save(per1);

NHibernate只会在Person表的OrganizationId列中设置值5。 你不会填充组织。