【问题标题】:OData CRUD Operations in ASP.NET Web API without race conditions没有竞争条件的 ASP.NET Web API 中的 OData CRUD 操作
【发布时间】:2013-03-08 16:11:40
【问题描述】:

official guidance for using OData in ASP.NET Web API 中,修改数据库的示例似乎都包含竞争条件。例如,示例UpdateEntity 方法调用_context.Products.Any 后跟_context.SaveChanges,但数据库可能在两次调用之间发生了变化。

这不同于 Visual Studio 为带有实体框架控制器的新 Web API 生成的样板代码,其中包含 DbUpdateConcurrencyException 的捕获块。是否有类似的模式是 OData 更新方法的最佳实践?

此外,调用Any 后跟SaveChanges 涉及两次数据库往返。是否有只制作一个的最佳做法?

【问题讨论】:

  • 调用 Any 后跟 SaveChanges 不会消除竞争条件,它只会降低覆盖数据的风险。我认为您需要的是使用并发令牌。当您尝试保存实体但数据库中的数据已更改时,EF 将抛出。查看这篇 msdn 文章以了解更多详细信息 msdn.microsoft.com/en-us/library/vstudio/…。如果您使用 DbContext,事情的工作方式类似

标签: asp.net entity-framework asp.net-web-api odata


【解决方案1】:

Any 调用只是确保您尝试更新的实体确实存在。您可以将该操作更改为,

protected override Product UpdateEntity(int key, Product update)
{
    try
    {
        _context.Entry(update).State = System.Data.EntityState.Modified;  
        _context.SaveChanges();
        return update;
    }
    catch(DbUpdateConcurrencyException)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
}

如果条目不存在,SaveChanges() 将抛出 DbUpdateConcurrencyException

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 2015-06-21
    • 2017-10-04
    • 1970-01-01
    • 2010-10-09
    • 2012-12-19
    • 2023-01-30
    相关资源
    最近更新 更多