ASP.NET を使用して、小売企業向けのアプリケーションを構築しています。データ アクセス レイヤーとして Entity Framework (モデル優先) を使用しています。ストアド プロシージャを使用して CRUD 操作を実行していますが、すべての列がマップされており、すべての CRUD 機能が期待どおりに機能しているため、正しいようです。
しかし、DELETE 操作で並行性の問題が発生しています。
TimeStamp
CRUD操作を行っているテーブルに列を追加しました。UPDATE 操作は、主キーとTimeStamp
値によって更新されるため、正常に機能します。したがって、TimeStamp
値が変更されたために UPDATE 操作で影響を受ける行がない場合、Entity Framework はOptimisticConcurrencyException
.
このDELETE
操作は、主キーと値による削除と同じ原理で機能しTimeStamp
ます。TimeStamp
ただし、エンティティとデータベースの間で値が一致しない場合、例外はスローされません。
C# の delete メソッドでは、最初に最新のレコードを取得してから、TimeStamp
プロパティを別のTimeStamp
値に更新します (取得した値とは異なる場合があります)。SQL プロファイラーを使用して調査したところ、DELETE
ストアド プロシージャが実行されていることがわかりましたが、ストアド プロシージャTimeStamp
に渡されたパラメーターは最新のTimeStamp
値であり、プロパティに設定した値ではありませんTimeStamp
。したがって、レコードは削除され、Entity Framework は例外をスローしません。
Entity Framework がTimeStamp
、プロパティに割り当てた値ではなく、取得した値を引き続きストアド プロシージャに渡すのはなぜですか? これはデザインですか、それとも何か不足していますか?
どんな助けでも大歓迎です!(あなたが彼女を必要とするとき、ジュリー・ラーマンはどこにいます! :-))