【发布时间】:2018-03-28 11:17:29
【问题描述】:
在使用 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,如果有的话?
【问题讨论】:
-
与实际与数据库服务器通信的时间相比,“快”在这里是一个有争议的问题;你几乎可以做任何事情(除了
Thread.Sleep),与实际的数据库调用相比,它仍然为零。如果你的意思是“作为调用者对我来说很方便”——也许添加一个TryGetSqlException扩展方法,这样你就可以编写一次并在很多地方使用它? -
@MarcGravell 也许“方便”是我想要使用的确切词。我想知道是否已经有一些我可以使用的第 3 方扩展方法,而不是自己编写。也许我听起来太懒了。
标签: c# entity-framework exception entity-framework-6 sqlexception