一种快速有效的方法来获得所需的内部异常

时间:2018-03-28 11:17:29

标签: c# entity-framework exception entity-framework-6 sqlexception

在使用Entity Framework 6的应用程序中,我跟踪在特殊设计的实体中对数据库中的表所做的更改。它们跟踪所有表的更改,包括它们自己的表。

因此,如果在保存数据库中的更改时发生异常,我会删除所有待处理的跟踪实体,以避免以递归方式创建新的跟踪器,记录异常并退出保存方法。

但是,如果由于连接超时引起异常,我会尝试3次重新保存更改,同时更改跟踪实体的EntityState以避免创建不必要的跟踪器。为了实现这一点,我需要捕获一个DbUpdateException,在异常层次结构中获取SqlException,并检查它的编号。但是,我不确定层次结构中的SqlException有多深。为了成功获得Sql异常,我写了这个:

catch (DbUpdateException duEx)
{
   var inner = new Exception();
   inner = duEx;
   do
   {
      inner = inner.InnerException;
   }
   while (!(inner is SqlException) && inner != null);

   var innerEx = inner as SqlException;

   if (innerEx != null && innerEx.Number == -2)
   {
      //do job here
   }

我测试了它似乎工作,但它看起来有点笨拙。所以我的问题是:有没有办法直接获得SqlException(如果有的话)?

1 个答案:

答案 0 :(得分:1)

  

我想知道的是,是否已经有了第三方   我可以使用的扩展方法

不,但您可以自己创建:

public static class Helper
{
    public static TException GetInnerException<TException>(this Exception ex) where TException : Exception
    {
         return ex.InnerException != null 
             ? ex.InnerException as TException ?? GetInnerException<TException>(ex.InnerException)
             : null;
    }
}

并使用它:

catch (DbUpdateException duEx)
{
   if (duEx.GetInnerException<SqlException>()?.Number == -2)
   {
      //do job here
   }
}