2013-03-08 79 views
1

在ASP.NET Web API中使用OData的official guidance中,修改數據庫的示例都顯示爲包含競爭條件。例如,示例UpdateEntity方法調用_context.Products.Any後跟_context.SaveChanges,但數據庫可能在調用之間發生了變化。OData在沒有競爭條件的ASP.NET Web API中的CRUD操作

這與Visual Studio爲帶有Entity Framework控制器的新Web API生成的樣板代碼不同,後者包含DbUpdateConcurrencyException的捕獲塊。是否有類似的模式,是OData更新方法的最佳實踐?

此外,調用Any後跟SaveChanges涉及兩個數據庫往返行程。有沒有最好的做法,只有一個?

+1

調用任何後跟SaveChanges不會消除競爭條件,它只會降低覆蓋數據的風險。我認爲你需要的是使用併發令牌。當您嘗試保存您的實體時,EF會拋出,但數據庫中的數據已經更改。看看這個msdn文章,瞭解更多詳情http://msdn.microsoft.com/en-us/library/vstudio/bb738618(v=vs.100).aspx。如果您使用的是DbContext,事情的工作方式也類似 – Pawel 2013-03-08 16:20:36

回答

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