.net - NHibernate 错误 - 在刷新之前保存 transient 实例

标签 .net nhibernate

我已经成功编写了一个包含带有子订单行的订单的系统,使用订单的级联更新来保存订单行。在下一次迭代中,我想将订单行与派送类相关联。这看起来很简单——将一个可为空的 DespatchID 列添加到订单行表作为 Despatch 表的外键。但是,当我将其添加到映射并保存订单对象时未在订单行上设置发货时,我收到错误消息“对象引用了未保存的 transient 实例 - 在刷新之前保存 transient 实例”。

如果我删除订单行和发货之间的关联,它会保存 OK。我只能假设错误是由于它试图保存不存在的发货而引起的。

以下是映射(订单行类称为 OrderProductAmount):

  <class name="NHS.WebTeam.PandemicFluDistribution.Order, NHS.WebTeam.PandemicFluDistribution" table="[Order]" lazy="false" optimistic-lock="version" where="Deleted=0" >
    <id name="ID" type="Int32" column="OrderID" unsaved-value="0">
      <generator class="hilo">
        <param name="table">NHibernateHiLo</param>
        <param name="column">NextValue</param>
        <param name="max_lo">100</param>
      </generator>
    </id>

    <version column="version" name="Version"/>
    <property name="Deleted" column="Deleted" />

    <property name="DateEntered"></property>
    <property name="RequiredDeliveryDate"></property>

    <many-to-one name="Practice" column="PracticeID"></many-to-one>

    <set name="OrderProductAmounts" access="field.camelcase-underscore" inverse="true" cascade="all-delete-orphan" lazy="true">
      <key column="OrderID"></key>
      <one-to-many class="NHS.WebTeam.PandemicFluDistribution.OrderProductAmount, PandemicFluDistribution" />
    </set>

  </class>

  <class name="NHS.WebTeam.PandemicFluDistribution.OrderProductAmount, NHS.WebTeam.PandemicFluDistribution" table="OrderProductAmount" lazy="false" optimistic-lock="version" where="Deleted=0" >
    <id name="ID" type="Int32" column="OrderProductAmountID" unsaved-value="0">
      <generator class="hilo">
        <param name="table">NHibernateHiLo</param>
        <param name="column">NextValue</param>
        <param name="max_lo">100</param>
      </generator>
    </id>

    <version column="version" name="Version"/>
    <property name="Deleted" column="Deleted" />

    <many-to-one name="Order" column="OrderID"></many-to-one>
    <many-to-one name="ProductAmount" column="ProductAmountID"></many-to-one>
    <many-to-one name="Despatch" column="DespatchID" cascade="none" not-null="false"></many-to-one>
  </class>

  <class name="NHS.WebTeam.PandemicFluDistribution.Despatch, NHS.WebTeam.PandemicFluDistribution" table="Despatch" lazy="false" optimistic-lock="version" where="Deleted=0" >
    <id name="ID" type="Int32" column="DespatchID" unsaved-value="0">
      <generator class="hilo">
        <param name="table">NHibernateHiLo</param>
        <param name="column">NextValue</param>
        <param name="max_lo">100</param>
      </generator>
    </id>

    <version column="version" name="Version"/>
    <property name="Deleted" column="Deleted" />

    <property name="DateDespatched"></property>
    <property name="RequiredDeliveryDate"></property>

    <many-to-one name="Practice" column="PracticeID"></many-to-one>

    <set name="OrderProductAmounts" access="field.camelcase-underscore" inverse="true" cascade="none" lazy="true">
      <key column="DespatchID"></key>
      <one-to-many class="NHS.WebTeam.PandemicFluDistribution.OrderProductAmount, PandemicFluDistribution" />
    </set>

  </class>

创建订单的代码本质上是这样的:
Dim practice = ... get relevant Practice ...
Dim productAmount = ... get relevant ProductAmount ...
Dim newOrder as Order = new Order(practice)
newOrder.AddProductAmount(new OrderProductAmount(newOrder, productAmount)
OrderDAO.Save(newOrder)

有人有什么想法吗?

最佳答案

正如上面的评论所暗示的那样(非常感谢),Despatch 听起来有些不对劲。而且,事实证明,Despatch 并不是问题所在。尽管由于某种原因它在我添加它之前就起作用了。

我通过向订单的 OrderProductAmount 链接添加 cascade="all"解决了这个问题:

<many-to-one name="Order" column="OrderID" cascade="all"></many-to-one>

引发的错误是在保存 OrderProductAmount 时 Order 仍然是 transient 的。这非常令人困惑,因为我保存的是 Order 而不是 OrderProductAmount - OrderProductAmounts 仅通过 Order 的级联保存。

所以,如果有人有任何想法为什么会这样,我很想知道。

关于.net - NHibernate 错误 - 在刷新之前保存 transient 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1667177/

相关文章:

entity-framework - NHibernate 中的 Lazy 是什么意思

c# - NHibernate 如何查询 IList<string> 属性?

.net - 正则表达式 单词边界混淆

.net - 使用 nHibernate 将未映射的数据转换为 DTO

c# - 如何获取Azure AD用户的上次登录时间?

c# - 从 HQL 返回额外数据

nhibernate - 如何在 QueryOver 中使用 SQL Count()

c# - 如何通过代理服务器使用 API 上传到 YouTube

.net - 如何在不使用用户设置的情况下在运行时读取/写入 app.config 设置?

c# - NHibernate并发问题