【发布时间】: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