6

に最大50000件の注文があるCustomerオブジェクトのようなものがありICollection<Orders>ます。顧客がローカル キャッシュにあると仮定しますが、注文はそうではありません。すべての顧客注文をキャッシュにロードしてマークを付けずに、顧客とそれに関連するすべての注文を削除するにはどうすればよいsetDeleted()ですか? ここでのベストプラクティスは何ですか。メソッドを拡張するpublic SaveResult SaveChanges(JObject saveBundle)ことが最善の方法だと思います。フラグのように、クライアント側で他の可能性はありますdelete_all_navigation_too()か?

ありがとう

4

2 に答える 2

6

データベースでカスケード削除を行っておらず、したくないと仮定する必要があります。個人的には、私は一般的に削除を「恐れて」おり、削除を避けようとしています。私は論理的な削除 (レコードを非アクティブとしてマークする) を好みます。しかし、誰もが同意するわけではなく、従うことができるわけではありません

それを行うために、Web API メソッド (「DeleteCustomerAndOrders」など) をコントローラーに追加することを検討します。Breeze メソッドだけでなく、クライアントから任意の API メソッドを呼び出すことができます。

これを推奨するにあたり、この種のことはアプリでは比較的まれであると想定しています。汎用のデリータ、親オブジェクト ID の配列を受け取るデリータ、一部の子オブジェクトを削除して他のオブジェクトを削除しないデリータなどは必要ありません。

このパスに従うと、問題をクライアントからサーバーに移動できます。それは良いことです。クライアントに注文をロードする必要はありませんでした。ここで、サーバー上でそれらを削除する必要があります。Entity Framework を使用している場合、注文を読み込まずに削除するという同じ課題に直面します。Alex James のソリューション: LINQ to Entities での一括削除を確認してください。

于 2012-12-09T17:46:36.347 に答える
5

私が思いつく最も簡単なアプローチは、データベースにカスケード削除制約を作成して、顧客が削除されたときにすべての注文も削除されるようにすることです。次に、クライアントで顧客を削除し、「SaveChanges」を呼び出します。さらに、Breezeはクライアント側の「カスケード」削除をまだサポートしていないため(これを検討しています)、すでにロードされているクライアント側の注文を繰り返し処理して「デタッチ」する必要があります。

于 2012-12-09T17:49:18.710 に答える