C# 为什么我能';在实体框架的SaveChanges()方法上捕获SqlException
我将C# 为什么我能';在实体框架的SaveChanges()方法上捕获SqlException,c#,entity-framework,try-catch,C#,Entity Framework,Try Catch,我将SaveChanges()方法放在try/catch块中,但无法捕获SqlExeption try { db.SaveChanges(); } catch (Exception ex) { } 您无法捕获SqlException,因为它不是直接抛出的,而是设置为DbUpdateException的内部异常 实体框架是处理数据库的抽象,它不直接依赖于任何数据库技术 请查看由SqlException引发的异常是System.Data.SqlClient.SqlExcept
SaveChanges()
方法放在try/catch块中,但无法捕获SqlExeption
try
{
db.SaveChanges();
}
catch (Exception ex)
{
}
您无法捕获
SqlException
,因为它不是直接抛出的,而是设置为DbUpdateException
的内部异常
实体框架是处理数据库的抽象,它不直接依赖于任何数据库技术
请查看由
SqlException引发的异常
是System.Data.SqlClient.SqlException类,因此无法捕获此异常是正常的
EntityFramework只能通过
例如,你可以这样做
try
{
db.SaveChanges();
}
catch (DbUpdateException ex)
{
}
catch (DbUpdateConcurrencyException ex)
{
}
更多上面提到的异常是实体框架定制的异常,只有
EF
负责何时以及如何触发它们。请看一下所需的行为已经解释清楚了。有一个明确的问题陈述。我很好奇为什么这被否决了……我在结束这个话题时打电话给BS。它显然是在主题上,甚至有示例代码显示预期的行为希望我们能投票否决那些投票关闭它的人。应该重新打开并分配接受的答案@usr问题很好,只是措辞不好。它应该这样说:我试图捕获SqlException以处理SaveChanges()引发的数据库错误。但是,当我使用“catch(SqlException ex)”时,不会捕获异常。如果我改为使用“catch(Exception ex)”,那么它确实有效。为什么会这样?调试器中的异常类型显示为SqlException。
我不知道为什么这个问题被关闭,从回答中可以明显看出,它有一个易于识别的答案,因此如果简单的话,这是一个很好的问题。这就是我为我的ui捕获(异常ex){while(ex.InnerException!=null)ex=ex.InnerException;spanError.Text=ex.Message;}找到根sql错误所做的操作。您的顺序错误。您应该先捕获DBUpdateeCurrencyException
,然后再捕获DbUpdateException
try
{
db.SaveChanges();
}
catch (DbUpdateException ex)
{
}
catch (DbUpdateConcurrencyException ex)
{
}