【问题标题】:Entity framework exceptions实体框架异常
【发布时间】:2013-04-05 13:56:14
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 首先感谢您的回答。在这种情况下,您能否提供一些链接或关键字,以更集中的方式处理超时、无法打开连接(除 DbUpdate 和 Concurrency 之外的其他)等异常。
    • 有一些想法 here 但底线是:您必须在不希望它们冒泡的地方处理它们,所以您将始终拥有 try-catch 块。跨度>
    猜你喜欢
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    相关资源
    最近更新 更多