我正在尝试使用映射文件中的“引用”来映射FluentNHibernate中的Person对象和Organization对象之间的父子关系:
引用文献(x => x.Organization);
关系是一个Person对象,其中包含一个OrganizationId列,该列与带有相应OrganizationId的Organization表中的记录相对应。不同的个人记录可以属于同一组织。
当我检索一个Person对象时,它可以正常工作。人员。组织已填充。我可以保存一个Person对象,它可以正常工作。但是,当我尝试添加一个新的Person对象时,我从NHibernate获取了一个索引超出范围异常。调用session.SaveOrUpdate(person)时发生异常。我尝试将映射更改为:
引用(x => x.Organization).Cascade.None()
仍然会出现相同的错误。我不知道是什么导致异常。完整的异常(exception)是:
System.IndexOutOfRangeException:对于此Count = 22的SqlParameterCollection,索引22无效。
在System.Data.SqlClient.SqlParameterCollection.RangeCheck(Int32索引)
在System.Data.SqlClient.SqlParameterCollection.GetParameter(Int32索引)
在System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item(Int32索引)
在NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd,对象值,Int32索引)
在NHibernate.Type.ManyToOneType.NullSafeSet(IDbCommand st,Object value,Int32 index,Boolean [] settable,ISessionImplementor session )
在NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(对象id,Object []字段,Object rowId,Boolean [] includeProperty,Boolean [] [] includeColumns,Int32表,IDbCommand语句,ISessionImplementor session ,Int32索引)
在NHibernate.Persister.Entity.AbstractEntityPersister.GeneratedIdentifierBinder.BindValues(IDbCommand ps)
在NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL,ISessionImplementor session ,IBinder绑定(bind)器)
在NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object []字段,Boolean [] notNull,SqlCommandInfo sql,Object obj,ISessionImplementor session )
在NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object []字段,Object obj,ISessionImplementor session )
在NHibernate.Action.EntityIdentityInsertAction.Execute()
在NHibernate.Engine.ActionQueue.Execute(IExecutable可执行文件)
在NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(对象实体,EntityKey键,IEntityPersister持久性, bool useIdentityColumn,对象任何东西,IEventSource源, bool requireImmediateIdAccess)
在NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(对象实体,字符串entityName,对象为任何对象,IEventSource源, bool 值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)
最佳答案
首先,发生异常是因为您在类中两次映射同一列,而这是不允许的。
检查这个
IndexOutOfRangeException Deep in the bowels of NHibernate
其次(根据您的最新评论),在您的Person类中具有OrganizationId和Organization属性有点违反规定。不用了您可以通过per1.Organization.Id
访问它
如果您的数据库中已经有一个Organization(例如Id = 5),并且使用OrganizationId外键将Organization类映射到Person类,那么在编写代码时
Organization theOrganizationWithId5 = nhSession.Get<Organization>(5);
per1.Organization = theOrganizationWithId5;
nhSession.Save(per1);
NHibernate只会在Person表的OrganizationId列中设置值5。
您将不会填充组织。
关于nhibernate - 添加新对象时,FluentNhibernate映射使用引用索引超出范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2418926/