2009-06-08 14 views
0

他のエンティティのコレクションを持つエンティティを保存しようとするとNHibernateで問題が発生します。NHibernate Exception:孤立した削除のコレクションスナップショットがありません

この例では、OrderとOrderLineです。 OrderLineはOrder with a Bagに関連付けられています。そのカスケードはDelete-Orphanに設定されており、Orderに対してSaveOrUpdateを呼び出すと、OrderLinesに対してSaveOrUpdateが呼び出されます。

例外はOrderのSaveOrUpdateで発生しますが、OrderLineのコレクションがnullでない場合にのみ発生します。

カスケードを「delete-orphan」に設定する前に、「すべて削除 - 孤立」していました.OnlineLineのSaveOrUpdateをNHibernateに利用できると思いました。問題は、各OrderLineにNumberが一意でなければならないということです。 Number = 2のOrderLineを削除し、Number = 2の新しいOrderLineを追加すると、NHibernateは古いOrphanを削除する前に新しいレジストリを挿入して更新するため、再度保存しようとすると例外がスローされます。

これにより、Orderエンティティ(Number = 2 OrderLineをコレクションから削除したもの)を保存すると、そのOrderLineが削除され、現在のOrderLinesに対してSaveOrUpdateを呼び出すと、一意のキー違反。

私はオーダー自体を保存するときに例外が発生するので、そうしませんでした。

ご協力いただければ幸いです。 ありがとう

答えて

0

お返事ありがとうございます。

新しいオーダーを作成して、コレクションに新しいOrderLinesを追加し、OrderオブジェクトのSaveOrUpdateを呼び出しても、 "コレクションスナップショットがありません"例外がスローされます。例外をスローするためのフラッシュやコミットも必要ありません。それはSaveOrUpdateの呼び出しにあります。 OrderLine.Numberの一意制約とは関係ありません。とにかく

、私が作ってみた解決策は以下のとおりです。

  • は、Remove
  • (注文ラインを活用する/アップデートセーブ/削除)カスケード=「全削除 - 孤児」と注文ラインバッグの地図データベース内のOrderLine.Numberの一意の制約。
  • 私のOrderRepositoryクラス(私はSharpArchitectureを使用しています)のSaveOrUpdateメソッドでアサーションを使用して、同じ番号の2つ以上のオーダーラインを持つオーダーを保存しないようにします。

私はこの解決策が嫌いです。しかし、今のところうまくいきます。

私はこのことについていくつかのより多くの考えを聞きたいのですが、どのように人々は、多くの場合、NHibernateは(注文ラインでの注文やカスケード=「全削除 - 孤児」にマッピングされた袋)

でこの問題を解決します
0

あなたは、NHibernateセッションの操作の問題の問題を抱えていると思います。 NHibernateは常に最初に挿入し、最後に削除します。唯一の留意点は、アイテムを削除してコレクションに追加する間にセッションをフラッシュすることです。プロセスは次のようになります。

var session = factory.OpenSession(); 
var tx = session.BeginTransaction(); 

order.Lines.Remove(line); 

// Write out the SQL up to this point, inside the transaction 
session.Flush(); 

order.Lines.Add(new OrderLine(...)); 

tx.Commit(); 
関連する問題