ASP.NET Web API中无竞争条件的OData CRUD操作
在ASP.NET Web API中使用OData的示例中,修改数据库的示例似乎都包含竞争条件。例如,示例ASP.NET Web API中无竞争条件的OData CRUD操作,asp.net,entity-framework,asp.net-web-api,odata,Asp.net,Entity Framework,Asp.net Web Api,Odata,在ASP.NET Web API中使用OData的示例中,修改数据库的示例似乎都包含竞争条件。例如,示例UpdateEntity方法调用\u context.Products.Any,后跟\u context.SaveChanges,但数据库可能在调用之间发生了更改 这与VisualStudio为带有Entity Framework controller的新Web API生成的样板代码不同,后者包含DbUpdateConcurrencyException的捕获块。OData更新方法是否有类似的最
UpdateEntity
方法调用\u context.Products.Any
,后跟\u context.SaveChanges
,但数据库可能在调用之间发生了更改
这与VisualStudio为带有Entity Framework controller的新Web API生成的样板代码不同,后者包含DbUpdateConcurrencyException
的捕获块。OData更新方法是否有类似的最佳实践模式
此外,调用
Any
,然后调用SaveChanges
涉及两次数据库往返。是否有只进行一次调用的最佳实践?任何调用都只是确保您尝试更新的实体实际存在。您可以将该操作更改为
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
任何调用都只是确保您尝试更新的实体实际存在。您可以将该操作更改为
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
调用任何后跟SaveChanges的项都不会删除竞争条件,它只会降低覆盖数据的风险。我认为您需要的是使用并发令牌。当您试图保存实体但数据库中的数据已更改时,EF将抛出。有关更多详细信息,请参阅这篇msdn文章。如果使用DbContextCalling Any后跟SaveChanges,情况也会类似,这不会删除竞争条件,只会降低覆盖数据的风险。我认为您需要的是使用并发令牌。当您试图保存实体但数据库中的数据已更改时,EF将抛出。有关更多详细信息,请参阅这篇msdn文章。如果您使用的是DbContext,那么工作方式也类似