2010-03-10 45 views
6

我试图映射一个Person对象,并使用引用在这样的映射文件中FluentNHibernate一个组织对象之间的父子关系:FluentNhibernate制图的参考指标超出范围时添加新的对象

引用(X => x.Organization);

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

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

引用(X => x.Organization).Cascade.None()

仍然得到同样的错误。我无法弄清楚是什么导致了这个异常。完全的例外是这样的:

System.IndexOutOfRangeException:该计数= 22的SqlParameterCollection的索引22无效。 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 ) 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表,IDbCommand语句,ISessionImplementor会话,Int32索引) at NHibernate.Persister。 Entity.AbstractEntityPersister.GeneratedIdentifierBin der.BindValues(IDbCommand的PS) 在NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL,ISessionImplementor会话的IBinder粘合剂) 在NHibernate.Persister.Entity.AbstractEntityPersister.Insert(对象[]字段,布尔[] NOTNULL, SqlCommandInfo SQL,对象OBJ,ISessionImplementor会话) 在NHibernate.Persister.Entity.AbstractEntityPersister.Insert(对象[]字段,对象OBJ,ISessionImplementor会话) 在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) 在NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId在NHibernate.Event.Default(对象实体,字符串的entityName,对象什么,IEventSource源,布尔requiresImmediateIdAccess) 在NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent事件) 。 DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent事件) 在NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent事件) 在NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent事件) 在NHibernate.Impl.SessionImpl.SaveOrUpdate(对象OBJ)

+0

我找不出什么原因导致异常,因为您没有发布导致异常的代码。 (实体/映射类) – Paco 2010-03-10 19:48:07

+0

只是在问题中添加了一些文本。它在调用session.SaveOrUpdate(person) 时发生,当person对象是数据库中不存在的新人时。 – Jeff 2010-03-10 20:35:07

+0

以前是否插入了父级组织? – mxmissile 2010-03-10 20:40:24

回答

7

首先会发生异常,因为您映射了同一列你班上有两次,这是不允许的。 检查这个 IndexOutOfRangeException Deep in the bowels of NHibernate

其次(根据您的最新评论),其具有OrganizationId并在Person类的组织属性是要对粮食排序的。你不需要它。您可以通过per1.Organization.Id

访问它。如果你已经在你的数据库有一个组织(说编号= 5),并且您使用OrganizationId外键映射组织类Person类,那么当你的代码

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

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