2009-08-04 7 views
3

私は、LineItemの子を含むInvoiceを受け付けるWebサービスを持っています。次に、データベースを更新して、NHibernateを使用してInvoiceを作成または更新します。WebサービスのNHibernateの親/子の孤立レコード

請求書が更新されると、それは現在持っているすべてのLineItemの子供とともにWebサービスに渡されます。追加と更新は完全に機能します。ただし、Webサービスコンシューマによって以前に保持された請求書から子LineItemが削除されて再提出された場合、そのLineItemはデータベースから実際に削除されるのではなく、親への逆参照がNULLに設定されます。私はカスケード= "すべて削除 - 孤児"を使用しています(使用しようとしています)。

この問題は、操作のステートレスな性質によるものと思われます(まず、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

をどのNHibernateの「到達可能性の持続性」の実装されていない機能として説明しています。ただし、有効な請求書の参照がなくてもすべてのLineItemを簡単に削除できますが、このソリューションも気に入らない場合もあります。 通常、ステートレス性を達成するためにクライアントオブジェクトを使用していますが、処理する前に請求書をロードすることになります。

+0

最初にサーバー側でインボイスを読み込む戦略を検討していましたが、それはかなり不必要なパフォーマンスです。 現在、私は孤立したレコードを今すぐやり直すことに傾いています。しかし、あなたが言うように、それはかわいいものではありません。 –