24

当在实体框架(CF、C#)中调用SaveChanges/SaveChangesAsync时,如果发生更改冲突(例如,自上次读取之后值已更新),那么我应该捕获这两个DbUpdateConcurrencyException异常中的哪一个?OptimisticConcurrencyException

它们之间有什么区别?

4

2 回答 2

20

DbUpdateConcurrencyException是由 抛出的特定异常DbContext,因此这是要捕获的异常。此异常可能是由底层引起的OptimisticConcurrencyException,但如果是这样,则将此异常包装为内部异常。

并不是所有的更新异常都是并发引起的,所以你也得先抓DbUpdateException DbUpdateConcurrencyException(因为后者是 的子类型DbUpdateException)。

另请参阅实体框架 5.0 处理乐观并发异常?.

于 2014-02-26T09:00:59.207 回答
2

你会得到一个OptimisticConcurrencyException. 看看这个

现在来看看差异。

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