我有一个问题:我需要表SalesHeader和SalesPosition - 其中SalesPosition是SalesHeader的子项.现在.在表SalesHeader中,有一个持久的实体X.我现在尝试在SalesPosition中保留一个实体,只给这个实体提供X(SalesHeader)的密钥.NHibernate不必在SalesHeader中保存一些数据.现在,当我将实体刷新到SalesPosition时,我成为了一个不幸的例外:
object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例.
at NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsaved(String entityName,Object entity,ISessionImplementor session)at NHibernate.Type.EntityType.GetIdentifier(Object value,ISessionImplementor session)at NHibernate.Type.ManyToOneType.IsDirty(Object old,Object current,Boolean [ NHibernate.Persister.Entity的NHibernate.Type.TypeFactory.FindDirty(StandardProperty []属性,Object [] x,Object [] y,Boolean [] [] includeColumns,Boolean anyUninitializedProperties,ISessionImplementor session)处的可检查,ISessionImplementor会话.在NHibernate.Event.Devent.DefaultFlushEntityEventListener的NHibernate.Event.Default.DefaultFlushEntityEventListener.DirtyCheck(FlushEntityEvent事件)处的AbstractEntityPersister.FindDirty(Object [] currentState,Object [] previousState,Object entity,ISessionImplementor session).IsUpdateNecessary(FlushEntityEvent事件,布尔mightBeDirty)在NHibernate.Event.Default.DefaultFlushEntityEventListener.OnFlushEntity(FlushEntityEvent事件)在NHibernate.Event.Default.AbstractFlushingEventListener.FlushEntities(FlushEvent事件)在NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions(FlushEvent事件)在NHibernate.Tranaction.AdoTransaction.Commit()的NHibernate.Impl.SessionImpl.Flush()NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent事件)在NHibernate.Tranaction.AdoTransaction.Commit()的NHibernate.Impl.SessionImpl.Flush()的NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent事件)中的FlushEverythingToExecutions(FlushEvent事件)在NHibernate.Tranaction.AdoTransaction.Commit()的NHibernate.Impl.SessionImpl.Flush()的NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent事件)中的FlushEverythingToExecutions(FlushEvent事件)
这是我对SalesPosition的映射:
<class name="SalesPosition" table="SalesPosition" lazy="false" >
<id name="Id" column="Id" type="Guid">
<generator class="assigned"/>
</id>
<version name="ObjectVersion" column="ObjectVersion"/>
.... some fields
<many-to-one name="SalesHeader" class="SalesHeader" foreign-key="FK_SalesHeader_SalesPosition" >
<column name="SalesHeaderId"/>
</many-to-one>
</class>
Run Code Online (Sandbox Code Playgroud)
这是SalesHeader的映射:
<class name="SalesHeader" table="SalesHeader" lazy="false" >
<id name="Id" column="Id" type="Guid">
<generator class="assigned"/>
</id>
<version name="ObjectVersion" column="ObjectVersion"/>
... some fields
<set name="SalesPosition" lazy="true" inverse="true" cascade="delete" >
<key>
<column name="SalesHeaderId"/>
</key>
<one-to-many class="SalesPosition"/>
</set>
</class>
Run Code Online (Sandbox Code Playgroud)
任何人都可以给我一个提示,我必须做的事情,我只能将SalesHeader的密钥提供给SalesPosition-Entity进行持久化(或者SalesHeader-Entity和NHibernate只使用密钥).
我使用NHibernate的最新版本.
谢谢.
最诚挚的问候,托马斯
如果我正确理解您的问题,您正在尝试保存SalesPosition实例,但您只想设置SalesPosition.SalesHeader.Id,而不是将SalesPosition.SalesHeader设置为SalesHeader的实例.您可以使用ISession.Load完成此操作; 这篇文章解释了它的工作原理.基本上,如果您知道数据库中存在实体,则可以使用Load为对象创建代理,而不是从数据库中获取它.这在无状态(web)应用程序中非常方便.用法是:
mySalesPosition.SalesHeader = session.Load<SalesHeader>(salesHeaderId);
session.Flush();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1612 次 |
| 最近记录: |