在ASP.NET Web API中使用OData的official guidance中,修改数据库的示例似乎都包含竞争条件。例如,示例UpdateEntity
方法调用_context.Products.Any
后跟_context.SaveChanges
,但数据库可能在调用之间发生了变化。
这与Visual Studio为具有Entity Framework控制器的新Web API生成的样板代码不同,后者包含DbUpdateConcurrencyException
的捕获块。是否有类似的模式是OData更新方法的最佳实践?
此外,调用Any
后跟SaveChanges
涉及两次数据库往返。是否有最佳做法只能制作一个?
答案 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
。