ADO.NET Entity Framework で楽観的同時実行制御を行うには ConcurrencyMode="fixed" が必要(同時実行モードを fixed へ)
ADO.NET Entity Framework で楽観的同時実行制御を行うには、モデル デザイナーで、エンティティ内の更新を検出したい列のプロパティで ConcurrencyMode(同時実行モード)を "fixed" へ設定しておく必要があります。
これを設定すれば、SaveChanges でのデータ更新時に、同時更新(更新競合)を検出してくれるようになります。
更新競合時は、次のように OptimisticConcurrencyException が発生してくれます。
OptimisticConcurrencyException ストアの更新、挿入、または削除ステートメントが予期しない数 (0) の行に影響しまし た。エンティティが読み込まれた以降に、エンティティが変更されたか、削除されていま す。ObjectStateManager のエントリを最新の情報に更新してください。
同時更新は、次のコードで試すことができます(Northwind DB の Products テーブルの ProductName 列に対して、ConcurrencyMode を fixed へ設定して、同時に 2つ実行すれば、更新競合を発生させることができます)。
Try Using ctx As New NorthwindEntities() Dim query = From p In ctx.Products _ Select p For Each p In query ' ProductID = 2(Chang)のデータを XXXXX へ更新 If p.ProductID = 2 Then p.ProductName = "XXXXX" Exit For End If Next ' 同時更新をシミュレートするために 10秒待機 System.Threading.Thread.Sleep(10000) ctx.SaveChanges() End Using Catch ex As OptimisticConcurrencyException Console.WriteLine(ex.Message) End Try Console.ReadKey()
■ 参考資料
変更の保存と同時実行制御の管理 (Entity Framework)
http://msdn.microsoft.com/ja-jp/library/bb738618.aspx