实体框架中的并发异常

时间:2014-02-26 08:25:04

标签: c# entity-framework entity-framework-6 optimistic-concurrency

在实体框架(CF,C#)中调用SaveChanges / SaveChangesAsync时,如果发生更改冲突(例如,自上次读取之后值已更新),那么这两个中的哪一个异常DbUpdateConcurrencyExceptionOptimisticConcurrencyException我能抓到吗?

它们之间有什么区别?

2 个答案:

答案 0 :(得分:16)

DbUpdateConcurrencyExceptionDbContext抛出的特定异常,所以这是要捕获的异常。此异常可能是由基础OptimisticConcurrencyException引起的,但如果是这样,则此异常将作为内部异常包装。

并非所有更新异常都是由并发引起的,因此您必须在捕获DbUpdateException之后捕获DbUpdateConcurrencyException (因为后者是DbUpdateException的子类型)。

另见Entity framework 5.0 handle optimistic concurrency exception?

答案 1 :(得分:1)

您将获得OptimisticConcurrencyException。看看this

现在出现差异。

  • OptimisticConcurrencyException :当出现乐观并发冲突时抛出(假设有多个人改变为相同的结果,这将导致不同步的问题)
  • DbUpdateConcurrencyException :当预期的行为是实体的SaveChanges导致数据库更新但实际上数据库中没有行受到影响时,DbContext抛出异常。这表明数据库已被同时更新,并且预期匹配的并发令牌实际上不匹配。由于安全性和序列化后对状态条目的访问将返回null,因此此异常引用的状态条目未被序列化。