【问题标题】:NHibernate - Save child - only set key from ParentNHibernate - 保存孩子 - 仅从父设置密钥
【发布时间】:2010-05-23 14:21:18
【问题描述】:

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

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

在 NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsaved(String entityName, Object entity, ISessionImplementor session) 在 NHibernate.Type.EntityType.GetIdentifier(对象值,ISessionImplementor 会话) 在 NHibernate.Type.ManyToOneType.IsDirty(旧对象,当前对象,布尔 [] 可检查,ISessionImplementor 会话) 在 NHibernate.Type.TypeFactory.FindDirty(StandardProperty[] 属性,Object[] x,Object[] y,Boolean[][] includeColumns,Boolean anyUninitializedProperties,ISessionImplementor 会话) 在 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 事件,布尔可能BeDirty) 在 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。

谢谢。

最好的问候,托马斯

【问题讨论】:

  • 抱歉,您的问题很难理解。我现在只能说:如果 SalesPosition 是一个子 SalesHeader(一对多关系,类似于账单和账单项目),那么您对 ​​SalesHeader 的映射是错误的,因为您正在执行映射,就好像它是一个多对-许多关系。

标签: nhibernate


【解决方案1】:

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

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

【讨论】:

  • 嗨。非常感谢。这正是我正在寻找的!
猜你喜欢
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 2018-12-12
  • 2020-05-26
  • 1970-01-01
相关资源
最近更新 更多