在使用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(如果有的话)?
答案 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
}
}