【问题标题】:NHibernate Parent/Child Orphaned Records with Web Service使用 Web 服务的 NHibernate 父/子孤立记录
【发布时间】:2009-08-05 04:36:58
【问题描述】:

我有一个接受 Invoice 的 Web 服务,其中包含 LineItem 子项。然后它更新数据库以使用 NHibernate 创建或更新发票。

当发票更新时,它会连同它现在拥有的所有 LineItem 子项一起传递给 Web 服务。添加和更新工作完美。但是,如果 Web 服务使用者从先前保留的 Invoice 中删除子 LineItem 并重新提交,则实际上不会从数据库中删除该 LineItem,而是将其对父级的反向引用设置为 NULL。我正在使用(尝试使用)cascade="all-delete-orphan" 但没有成功。

我怀疑问题可能是由于操作的无状态性质(我没有首先在 Web 服务端的 Invoice.LineItemList 中有 LineItem 然后将其删除,而只是获取 LineItem 的列表作为他们现在应该是)。但是,NHibernate 足够聪明,可以将反向引用列清空,所以我希望有一种直接的方法可以让它删除该行。

这里是映射(简化)。

Parent object (Invoice):

<property name="InvoiceNumber" />
        <!-- If inverse="true", InvoiceId is NOT set to NULL and the record remains -->
<bag name="LineItemList" table="lineitems" inverse="false"  cascade="all-delete-orphan">
  <key column="InvoiceId"/>
  <one-to-many 
    class="LineItem"/>
</bag>    

子对象(LineItems):

<many-to-one lazy="false" name="Parent" column="InvoiceID" not-null="false"
             class="Invoice,Company.Business"
             />

<property name="LineItemNumber" />
<property name="SalesAmount"/>

Web Service 持久化代码如下所示:

[WebMethod]

public Invoice PutInvoice(发票发票) { // 需要重建父引用,见Blog

foreach (LineItem item in invoice.LineItems)
{
    item.Parent = invoice;
}

using (PersistenceManager pm = new PersistenceManager())
{
    pm.Save<Invoice>(invoice);
}

return invoice; // Return version potentially modified with DB-assigned ID

}

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    你是对的,这与你的对象的分离状态有关,并且是承认性能的一个已知限制,NHibernate 将其描述为“可达性持久性”的未实现特性。但是,您当然可以在没有有效发票参考的情况下轻松删除所有 LineItem,但我也不喜欢这种解决方案。 通常我使用客户端对象来实现无状态,这当然会导致在操作之前加载发票。

    【讨论】:

    • 我正在考虑首先在服务器端加载发票的策略,但这对性能造成了不必要的影响。目前我倾向于不时清理孤立的记录,但正如你所说,它并不漂亮。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    相关资源
    最近更新 更多