gpt4 book ai didi

.net - 处理 Entity Framework OptimisticConcurrencyException

转载 作者:行者123 更新时间:2023-12-04 18:52:44 26 4
gpt4 key购买 nike

评估 .NET Entity Framework 我尝试找到正确的模式来处理具有乐观并发模式的并发更新。

documentation和许多其他地方我看到以下模式:

尝试
' 尝试保存更改,这可能会导致冲突。
Dim num As Integer = context.SaveChanges()
Console.WriteLine("没有冲突。"& num.ToString() & "更新已保存。")
将生成的异常名称捕获为 OptimisticConcurrencyException
' 通过刷新来解决并发冲突
' 重新保存更改之前的对象上下文。
context.Refresh(RefreshMode.ClientWins, orders)

' 保存更改。
上下文.SaveChanges()
Console.WriteLine("OptimisticConcurrencyException 已处理并已保存更改")
结束尝试

我看到以下问题

  • 它自动实现最后的胜利而不是使用乐观模式
  • 它并不健壮:.Refresh 和 .SaveChanges 之间的并发更改会导致新的 OptimisticConcurrencyException

  • 这是正确的,还是我错过了什么?

    在 UI 中,我通常让用户解决并发冲突:

    尝试
    _ctx.SaveChanges()
    Catch ex As OptimisticConcurrencyException
    MessageBox.Show("数据已被另一个用户修改。"& vbCrLf &
    "单击“刷新”以显示当前值并重新应用您的更改。",
    “并发冲突”,MessageBoxButton.OK)
    结束尝试


    在业务逻辑中,我通常在整个业务事务(读取和更新)周围使用重试循环:

    常量 maxRetries = 5,retryDelayMs = 500
    对于 i = 1 到 maxRetries
    尝试
    使用 ctx 作为新的 EFConcurrencyTest.ConcurrencyTestEntities
    ctx.Inventories.First.QuantityInStock += 1
    System.Threading.Thread.Sleep(3000) '引起冲突
    ctx.SaveChanges()
    结束使用
    退出
    Catch ex As OptimisticConcurrencyException
    如果 i = maxRetries 然后抛出
    System.Threading.Thread.Sleep(retryDelayMs)
    结束尝试
    下一个


    使用 EF 我计划封装循环:

    ExecuteOptimisticSubmitChanges(Of EFConcurrencyTest.ConcurrencyTestEntities)(
    子(ctx)
    ctx.Inventories.First.QuantityInStock += 1
    System.Threading.Thread.Sleep(3000) '引起冲突
    结束子)


    看:

    Functional Optimistic Concurrency in C#

    Retryable actions in C#

    最佳答案

    这个:

    Catch ex As OptimisticConcurrencyException
    ' Resolve the concurrency conflict by refreshing the
    ' object context before re-saving changes.
    context.Refresh(RefreshMode.ClientWins, orders)

    ' Save changes.
    context.SaveChanges()
    Console.WriteLine("OptimisticConcurrencyException handled and changes saved")

    ……完全没有意义。如果您在“处理”异常时所做的唯一一件事就是忽略它并仍然保存,那么您应该关闭乐观并发;您正在编写代码来解决可选功能。

    所以,是的,我想说这里的文档没有给你很好的建议。

    您提出的 UI 代码是更好的解决方案。

    关于.net - 处理 Entity Framework OptimisticConcurrencyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3725663/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com