【问题标题】:LINQ - ConflictChangeExceptionLINQ - 冲突更改异常
【发布时间】:2023-03-09 12:53:01
【问题描述】:

我目前面临一个我目前似乎可以解决的问题。

我们在数据库中有一个用于文章的表。保存后 - 对不同的供应商进行 API 调用,该供应商将在一段时间后使用他们的订单号更新该行的列。

但是,如果呼叫被延迟并且用户正在编辑文章,他们将收到 ConflictChangeException,其中只是表示文章已被更改,他们必须关闭并重新打开它。

现在我想捕获异常,如果冲突的原因是该供应商更改了列以使用 RefreshMode 做一些魔术,但如果不是,则仍然抛出异常,因为另一个用户更改了文章。

最大的问题是 SQL 服务器 timestamprow-version(你有什么)将众所周知的棍子放在方向盘上。在使用来自供应商的新订单号进行更新之前,我无法重新加载这些值,因为该 timestamp 列中仍然存在冲突。

在 LINQ to SQL 模型中,timestamp 属性设置为

 <Column(Storage:="_Timestamp", AutoSync:=AutoSync.Always, DbType:="rowversion NOT NULL", CanBeNull:=false, IsDbGenerated:=true, IsVersion:=true, UpdateCheck:=UpdateCheck.Never)>  _

由于UpdateCheck 设置为从不,IsDbGenerated 设置为true,我认为 LINQ 在发生冲突时会忽略它,但不会。

这是一个失败的原因吗?我是否只需要不断告诉用户进行了更改并且他们必须重新加载?

【问题讨论】:

    标签: sql-server vb.net linq


    【解决方案1】:

    我通过捕获 ChangeConflictException 然后循环通过 MemberChangeConflict 并进行一些更正并在未处理时抛出异常来解决它。

    Catch ex As System.Data.Linq.ChangeConflictException
        For Each ooc As System.Data.Linq.ObjectChangeConflict In data.ChangeConflicts
            Dim conflict As System.Data.Linq.MemberChangeConflict = ooc.MemberConflicts.ToList().Find(Function(p) p.Member.Name = "VendorUpdatedTable")
            If Not IsNothing(Conflict) Then
                For Each mcc As System.Data.Linq.MemberChangeConflict In ooc.MemberConflicts
                    If mcc.Member.Name = "UserId" Then
                        If (CInt(mcc.OriginalValue) <> CInt(mcc.DatabaseValue)) Then
                            Throw ex
                            Exit For
                        End If
                    End If
                    If mcc.Member.Name = "VendorTableName" Then
                        mcc.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues)
                    Else 
                        mcc.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues)
                    End If
                 Next
             Else : Throw ex
             End If
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多