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

时间:2010-05-23 14:21:19

标签: nhibernate

我有一个问题: 我必须表SalesHeader和SalesPosition - 其中SalesPosition是SalesHeader的子项。 现在。在表SalesHeader中,有一个持久的实体X.我现在尝试在SalesPosition中保留一个实体,只给这个实体提供X(SalesHeader)的密钥。 NHibernate不必在SalesHeader中保存一些数据。现在,当我将实体刷新到SalesPosition时,我成了一个暂时的例外:

对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。

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 [] checkable,ISessionImplementor session)    at NHibernate.Type.TypeFactory.FindDirty(StandardProperty [] properties,Object [] x,Object [] y,Boolean [] [] includeColumns,Boolean anyUninitializedProperties,ISessionImplementor session)    at NHibernate.Persister.Entity.AbstractEntityPersister.FindDirty(Object [] currentState,Object [] previousState,Object entity,ISessionImplementor session)    在NHibernate.Event.Default.DefaultFlushEntityEventListener.DirtyCheck(FlushEntityEvent事件)    在NHibernate.Event.Default.DefaultFlushEntityEventListener.IsUpdateNecessary(FlushEntityEvent事件,布尔值mightBeDirty)    在NHibernate.Event.Default.DefaultFlushEntityEventListener.OnFlushEntity(FlushEntityEvent事件)    在NHibernate.Event.Default.AbstractFlushingEventListener.FlushEntities(FlushEvent事件)    在NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions(FlushEvent事件)    在NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent事件)    在NHibernate.Impl.SessionImpl.Flush()    在NHibernate.Transaction.AdoTransaction.Commit()

这是我对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>

这是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>

任何人都可以给我一个提示,我必须做的事情,我只能将SalesHeader的密钥提供给SalesPosition-Entity进行持久化(或者SalesHeader-Entity和NHibernate只使用密钥)。

我使用NHibernate的最新版本。

谢谢。

最诚挚的问候,托马斯

1 个答案:

答案 0 :(得分:9)

如果我正确理解您的问题,您正在尝试保存SalesPosition实例,但您只想设置SalesPosition.SalesHeader.Id,而不是将SalesPosition.SalesHeader设置为SalesHeader的实例。您可以使用ISession.Load完成此操作; this posting解释了它的工作原理。基本上,如果您知道数据库中存在实体,则可以使用Load为对象创建代理,而不是从数据库中获取它。这在无状态(web)应用程序中非常方便。用法将是:

mySalesPosition.SalesHeader = session.Load<SalesHeader>(salesHeaderId);
session.Flush();