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