0

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 をエンティティにマッピングし直したことが原因ですか?

誰かが私を正しい方向に向けることができますか?

よろしく

4

1 に答える 1

0

実際にはDateTimeフィールドであるカスタム「RowVersion」列を使用してこれを解決しました。いずれにしても手動で CRUD を処理する必要があるため、このフィールドを更新または確認することは問題ありません。

于 2013-04-02T10:34:17.097 に答える