使用Web服务的NHibernate父/子孤儿记录

时间:2009-08-04 19:33:32

标签: nhibernate

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

更新发票后,它会与现在拥有的所有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服务持久性代码如下所示:

[WebMethod]

公开发票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

}

1 个答案:

答案 0 :(得分:1)

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