首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用实体框架核心来更新ASP.NET核心中相同字段的并行请求

使用实体框架核心来更新ASP.NET核心中相同字段的并行请求
EN

Stack Overflow用户
提问于 2019-10-27 12:30:52
回答 1查看 990关注 0票数 1

我的web应用程序是使用ASP.NET Core2.2和Pomelo.EntityFrameworkCore.MySql 2.2.0开发的。在PUT请求中,我更新数据库中的一个列。下面的代码是我的演示:

代码语言:javascript
复制
[Produces("application/json")]
[Route("api/{id}/increment/{increment}")]
[HttpPut]
public async Task<IActionResult> PutIncrement([FromRoute] int id, [FromRoute] float increment)
{
    Model m = _context.Model
                      .Where(f => f.Id == id)
                      .SingleOrDefault();

    m.Value += increment;

    _context.Entry(m).State = EntityState.Modified;

    await _context.SaveChangesAsync();

    return Ok(m);
}

然后,我与7个CPU并行调用相同的请求(https://localhost/api/1/increment/1) 10次。但是,数据库中的实际值远小于10 (约2-4)。如何在ASP.NET核心中逐一处理请求?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-27 12:54:51

您可以实现乐观并发。

乐观并发假设所做的更新将被接受,但在数据库中进行更改之前,记录的原始值将与数据库中的现有行进行比较,如果检测到任何更改,则会引发并发异常。

可以通过添加属性RowVersion来启用它,如下所示

代码语言:javascript
复制
public class Model
{
     public int Id {get;set;}
     ........ // Other Properties
     public int Value {get; set;} 

     [TimeStamp]
     public byte[] RowVersion { get; set; }
}

RowVersion列将被配置为提供自动行版本控制的数据库类型。

现在,您可以将SaveChangesAsync方法包装在try-catch中,以处理乐观的并发问题。有关更多细节,请查看微软文档

代码语言:javascript
复制
try
{
    // business logic
    await _context.SaveChangesAsync();
    // Other business logic
}
catch (DbUpdateConcurrencyException ex)
{
    // your logic to handle optimistic concurrency.
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58579442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档