实体框架异常

时间:2013-04-05 13:56:15

标签: entity-framework exception dbcontext unit-of-work

我已经有了这个想法很长一段时间,我仍然找不到任何答案。我的DbContext由UnitOfWork类处理。所以我有一个地方,保存更改发生,我正在捕捉所有这些讨厌的例外,并在一个地方处理它们。

但是,众所周知,除了SaveChanges()方法之外,DbContext有时会在其他地方抛出其他类型的异常。例如,在实体化时。但是在许多地方都会发生这种情况,并且有时会在每个FirstOrDefault()或ToList()调用上编写try catch块并捕获并重新抛出异常。 有时,这种异常可能是SQL类型,意味着无法打开连接,EntityCommandExecutionException或其他。

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

1 个答案:

答案 0 :(得分:2)

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

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

  2. 如何解雇此事件?有几种方法可以举办活动。其中一个只是一个catch块中的re-throw。在catch块中触发event听起来像非常不好的做法。 Catch块应包含安全,稳定的代码。如果catch块中发生异常,事情会变得越来越糟。如果有人能在我的catch块中连接任何类型的代码,那将会给我一种非常糟糕的感觉。

  3. 什么时候应该解雇?在EF程序集中可能会抛出一些异常。你甚至可能都不想知道它们发生了。但在另一种情况下,同样的例外可能会冒出来。