1

こんにちは、breezejs を使用しているときにカスケード削除に問題があります。具体的には、AngularJS と BreezeJS (1.3.1 バージョン) で Asp.net Mvc SPA テンプレートを使用します。Phone オブジェクトのナビゲーション プロパティを持つ Customer オブジェクトがあります。電話には、NotNull およびカスケード削除に設定された Customer への FK があります。

私の問題は、クライアントで親 Customer を削除して SaveChanges (これは Web Api メソッドです) を呼び出そうとすると、SqlServer で DbUpdateException が発生することです。

私は電話を明示的に編集していませんが、breezejs クライアントは、削除済みとしてマークされた顧客オブジェクトと変更済みとしてマークされた電話オブジェクトを送り返していることがわかります。

どうやら Phone の FK を nullable に設定すると、例外はありません。親の Customer オブジェクトは削除されますが、Phone オブジェクトは削除されず、代わりに Customer への FK が null に設定されます。

Phone オブジェクトも削除したいのですが、FK 列は notnull のままにしておきます。助けていただければ幸いです。

編集の更新:

問題は、クライアントで EntityManager.saveChanges() を呼び出すときだと思います。Customer 親オブジェクトを削除すると、その entityState は削除済みに設定され、すべての FK 参照は、現在 EnityState が "Modified" になっている Phone オブジェクトのように null に設定されます。ただし、EntityManager.saveChanges() を呼び出すと、サーバーで更新と削除が発生し、電話の FK が「Not Null」に設定されているという競合が発生します。EntityManager.saveChanges([Customer]) を呼び出すとうまくいく場合があります。

#

ありがとうございました。

4

1 に答える 1

1

あなたの評価は正しいので、さらに追加しようとします。

顧客に対して setDeleted() を呼び出すと、微風は fkey 値を参照するすべてを null にします。あなたの場合は電話レコードです。その結果、顧客は削除された状態になり、電話機は変更された状態になります。saveChanges を呼び出すと、電話機に対する UPDATE と顧客に対する DELETE が発生します。phone の customer ref が null 許容の場合、これは成功するはずです (UPDATE が DELETE の前に行われると仮定します)。null 不可の場合、電話の顧客参照が null であるというクライアント側のエラーが発生することが予想されます。ただし、クライアントがそれをキャッチできなかった場合は、サーバーがキャッチします。

あなたは顧客と一緒に電話を削除したいと言っています。削除をカスケードするように顧客を設定できます。次に、 saveChanges([Customer]) が機能するはずです。その後、実際にはなくなっているため、その電話レコードをキャッシュから削除 (デタッチ) する必要があります。後で保存しようとすると、レコードが存在しないため、サーバーは UPDATE ステートメントで失敗します。

または、電話レコードでも setDeleted を呼び出してから、 saveChanges() を呼び出して両方を保存できると思います。私はそよ風が 2 つの DELETE を行うと仮定します。レコードも更新しようとしないと思います。

于 2014-02-04T16:06:34.123 に答える