Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET Web API中无竞争条件的OData CRUD操作_Asp.net_Entity Framework_Asp.net Web Api_Odata - Fatal编程技术网

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

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更新方法是否有类似的最

在ASP.NET Web API中使用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,那么工作方式也类似