没有竞争条件的ASP.NET Web API中的OData CRUD操作

时间:2013-03-08 16:11:40

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

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

这与Visual Studio为具有Entity Framework控制器的新Web API生成的样板代码不同,后者包含DbUpdateConcurrencyException的捕获块。是否有类似的模式是OData更新方法的最佳实践?

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

1 个答案:

答案 0 :(得分: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