NHibernate - 保存子级 - 仅从父级设置密钥

Ben*_*ual 0 nhibernate

我有一个问题:我需要表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的最新版本.

谢谢.

最诚挚的问候,托马斯

Jam*_*Ide 9

如果我正确理解您的问题,您正在尝试保存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)