gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:03:42 28 4
gpt4 key购买 nike

我已经成功编写了一个包含带有子订单行的订单的系统,使用订单的级联更新来保存订单行。在下一次迭代中,我想将订单行与派送类相关联。这看起来很简单——将一个可为空的 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com