1

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

这与 Visual Studio 为带有实体框架控制器的新 Web API 生成的样板代码不同,后者包含DbUpdateConcurrencyException. 是否有类似的模式是 OData 更新方法的最佳实践?

Any此外,随后的调用SaveChanges涉及两次数据库往返。有没有最好的做法只做一个?

4

1 回答 1

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.

于 2013-03-08T22:33:25.747 回答