entity framework中的并发exception

在Entity Framework(CF,C#)中调用SaveChanges / SaveChangesAsync时,如果发生更改冲突(例如,自上次读取之后值已更新),那么我应该捕获这两个exception中的DbUpdateConcurrencyExceptionOptimisticConcurrencyException

它们之间有什么区别?

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

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

另请参见Entity framework 5.0处理乐观并发exception? 。

您将获得OptimisticConcurrencyException 。 看看这个 。

现在变得不同了。

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