1

我脑子里一直有这个想法,但我仍然找不到任何答案。我的 DbContext 由 UnitOfWork 类处理。所以我有一个地方发生了保存更改,我正在捕获所有这些讨厌的异常并在一个地方处理它们。

但是,众所周知,DbContext 有时会在 SaveChanges() 方法之外的其他地方引发其他类型的异常。例如在实体化实体时。但这可能发生在很多地方,有时在每个 FirstOrDefault() 或 ToList() 调用上编写 try catch 块并捕获并重新抛出异常是开销。有时,此异常可能是 SQL 类型,即无法打开连接、EntityCommandExecutionException 或其他异常。

所以我想知道当异常发生时 DbContext 对象是否会触发任何事件,所以我可以订阅该事件并在这些场景中处理一些逻辑。:)

4

1 回答 1

2

不,没有。并且永远不会,因为(至少)三个原因:

  1. 异常可能是故意抛出的,但它们也可能只是发生在 EF 源代码中的某个地方并冒泡。在前一种情况下,他们可以触发一个事件,在后一种情况下则不能。所以你永远不会安全。

  2. 应该如何触发事件?有几种方法可以引发事件。其中一个只是重新扔进一个catch块。在 catch 块中触发一个event听起来糟糕的做法。Catch 块应该包含安全、稳定的代码。如果在 catch 块中发生异常,事情会变得更糟。如果有人可以在我的 catch 块中连接任何类型的代码,我会感到非常糟糕。

  3. 什么时候应该触发事件?在 EF 程序集中可能会引发和处理一些异常。您可能甚至都不想知道它们发生了。但在另一种情况下,同样的异常可能会冒泡。

于 2013-04-05T14:30:04.977 回答