web-dev-qa-db-ja.com

Entity Frameworkの同時実行例外

Entity Framework(CF、C#)でSaveChanges/SaveChangesAsyncを呼び出すときに、変更の競合が発生した場合(たとえば、値が最後に読み取られてから更新されている場合)、次の2つの例外のどちらかDbUpdateConcurrencyException OR OptimisticConcurrencyException釣れますか?

そして、それらの違いは何ですか?

21
Flair

DbUpdateConcurrencyExceptionDbContextによってスローされる特定の例外であるため、これはキャッチする例外です。この例外は、基になるOptimisticConcurrencyExceptionが原因で発生する可能性がありますが、その場合、この例外は内部例外としてラップされます。

すべての更新例外が同時実行によって引き起こされるわけではないので、DbUpdateExceptionafterをキャッチしてDbUpdateConcurrencyExceptionをキャッチする必要もあります(後者はDbUpdateException)のサブタイプです。

参照 エンティティフレームワーク5.0はオプティミスティック同時実行例外を処理しますか?

16
Gert Arnold

OptimisticConcurrencyExceptionを取得します。 this をご覧ください。

今、違いに来ています。

  • OptimisticConcurrencyException:楽観的同時実行違反が発生した場合にスローされます(複数のユーザーが同じ結果に変化していると仮定すると、同期しないという問題が発生します) )
  • DbUpdateConcurrencyException:エンティティのSaveChangesによってデータベースが更新されるが、実際にはデータベース内の行に影響が及ばないことが期待される場合にDbContextによってスローされる例外。これは、データベースが同時に更新され、一致すると予想されていた同時実行トークンが実際には一致しなかったことを示しています。この例外によって参照される状態エントリはセキュリティのためにシリアル化されず、シリアル化後の状態エントリへのアクセスはnullを返します。
1
Rohan