1

ASP.NET Web API で OData を使用するための公式ガイダンスでは、データベースを変更するすべてのサンプルに競合状態が含まれているようです。たとえば、サンプルUpdateEntityメソッド呼び出しの後に が_context.Products.Any続き_context.SaveChangesますが、呼び出し間でデータベースが変更されている可能性があります。

これは、Entity Framework コントローラーを使用して新しい Web API 用に Visual Studio によって生成されたボイラープレート コードとは異なりますDbUpdateConcurrencyException。OData 更新メソッドのベスト プラクティスである同様のパターンはありますか?

さらに、呼び出しAny後に続く呼び出しにSaveChangesは、2 つのデータベース ラウンド トリップが含まれます。1つだけにするベストプラクティスはありますか?

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 に答える