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