VS 2012 に同梱されている Framework 4.5 と EF 5.0 を使用しています。同時実行チェックに使用する予定の RowVersion という名前の列を含むエンティティがあります。これは、レコードの INSERT または UPDATE 時に自身を更新する MySQL テーブルの「タイムスタンプ」値です。
デフォルトの EF 5 codegen は、次の POCO を生成します。
Partial Public Class Terminal
Public Property ID As Long
Public Property User_ID As Nullable(Of Long)
Public Property Name As String
Public Property Number As Nullable(Of Integer)
Public Property Location As String
Public Property Description As String
Public Property IsEnabled As Boolean
Public Property RowVersion As Date
Public Overridable Property UserSession As ICollection(Of UserSession) = New HashSet(Of UserSession)
End Class
「RowVersion」プロパティの同時実行モードを「固定」に設定して、同時実行チェックを有効にしました。「StoreGeneratedPattern」は「Computed」に設定されています。オートマッパーを介してマップされた DTO を使用して、WCF サービスを介してデータを送信しています。
サービスを介して返されるエンティティの更新に問題があります。ここにいくつかのコードがあります:
Public Sub SaveTerminal(Term As TerminalDto)
Using db As New PasgaEntities(conString)
Dim tmpTerminal As Terminal = Mapper.Map(Of Terminal)(Term)
db.Terminal.Attach(tmpTerminal)
db.Entry(tmpTerminal).State = EntityState.Modified
db.SaveChanges() 'throws OptimisticConcurrencyException
End Using
End Sub
これは、「rowVersion」が変更されていない場合でも、常に OptimisticConcurrencyException をスローすることになります。これは、DTO をエンティティにマッピングし直したことが原因ですか?
誰かが私を正しい方向に向けることができますか?
よろしく