gpt4 book ai didi

c# - 如何重试与 ASP.NET Core、EF Core 的乐观并发冲突?

转载 作者:行者123 更新时间:2023-12-05 07:09:36 27 4
gpt4 key购买 nike

假设我有一个实体,它在 EF 核心中配置了一个并发 token 列。当由于数据库中的数据发生更改而发生异常时,我想从干净的上下文中重试整个事务。

所有示例都使用以下模式:

using (var context = new PersonContext())
{
try
{
//Business logic
}
catch (DbUpdateConcurrencyException ex)
{
//Reload/merge entries in ex.Entries, etc...
}
}

该示例有效,但是当 DbContext 注册为作用域服务并将其注入(inject)存储库时,您将如何处理这种情况,并且您遇到了更复杂的情况。我认为重试整个业务流程比处理冲突更容易。

public class SomeService {
public SomeService (ISomeRepository repo)
{
}

public Task SomeMethod()
{
try
{
//Business logic
}
catch (DbUpdateConcurrencyException ex)
{
//clean context, restart SomeMethod()
}
}
}

处理重试过程的简洁方法是什么?

最佳答案

您不需要重新启动整个 DbContext。只需刷新您正在修改的实体即可。

您可以像这样用数据库的当前值替换实体的原始数据库值:

public class SomeService {
public SomeService (ISomeRepository repo)
{
}

public Task SomeMethod(Dto dto)
{
try
{
//Business logic
}
catch (DbUpdateConcurrencyException ex)
{
var entry = e.Entries.FirstOrDefault(x => x.Entity is <your entity type> ); // You can also check the Id.
if(null == entry)
throw e;

var dbValue = entry.GetDatabaseValues();

if (null == dbValue)
throw new Exception("The entity is deleted from the database in the meanwhile.");

entry.OriginalValues.SetValues(dbValue);
SomeMethod(dto);
}
}
}

EF 使用原始数据库值检查乐观并发 token 。

关于c# - 如何重试与 ASP.NET Core、EF Core 的乐观并发冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61511269/

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