【问题标题】:.net web api insert multiple same data.net web api插入多个相同的数据
【发布时间】:2021-08-24 01:48:52
【问题描述】:

如果数据库中不存在名称,我想要创建数据,但是,当我使用 ajax 请求测试代码时,它有时会创建多个具有相同名称的数据。 我在想,原因是第一个数据和第二个数据同时到达数据库。有没有办法解决这个问题?

    [HttpPut]
    public async Task<IActionResult> Put(string name)
    {
        if (name == null)
            return BadRequest();

        View view = await _context.Views
            .FirstOrDefaultAsync(v => v.PageName.ToLower() == name.ToLower());

        if (view != null)
        {
            view.NumOfViews++;

            await _context.SaveChangesAsync();
                
            return Ok(new { view, status = 200 });
        }
        else
        {
            //not exist in db create a new one
            View newView = new View
            {
                PageName = name,
                NumOfViews = 1
            };

            view = await _viewHelper.CreateAsync(newView);

            return CreatedAtAction("Put",new { status=201, view});
        }
    }

【问题讨论】:

  • 在 Name 上创建唯一索引?

标签: c# sql asp.net .net webapi


【解决方案1】:

有几种方法可以做到这一点。例如,您可以在数据库上开始事务以锁定表。或者尝试阻止来自您的前端的双重请求(顺便说一下可能带有取消令牌)。或者尝试在您的 Startup 类上禁用一段时间内的双重请求。 那么你需要什么?这是为了防止你的前端双击?

这是来自 Dapper for Transactions 的一些代码 sn-p 例如:

 using System.Transactions;    
....    
using (var transactionScope = new TransactionScope())
{
    DoYourDapperWork();
    transactionScope.Complete();
}

【讨论】:

    【解决方案2】:

    如果表中的名称是uniuqe,则可以添加数据库级别的限制。在 savechanges 之前使用事务来保存价值并检查重复。

    【讨论】:

      【解决方案3】:

      你可以使用 if exists 关键字在插入 db 之前检查数据的重复性。

      【讨论】:

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