我们正在使用随 VS 2012 提供的 Framework 4.5 和 EF 5.0。我们有一个实体,其中包含一个名为 RowVersion 的列,我计划将其用于并发检查。它是 MySQL 表中的一个“时间戳”值,它在插入或更新记录时会自行更新。
默认 EF 5 代码生成生成此 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”属性的并发模式设置为“fixed”以启用并发检查,“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 映射回实体引起的吗?
有人可以指出我正确的方向吗?
问候