为什么我无法在Entity Framework的SaveChanges()方法上捕获SqlException

J -*_*per 11 c# entity-framework try-catch

我把SaveChanges()方法放在try/catch块中,但我无法捕获SqlExeption.

try
 { 
     db.SaveChanges();
 }
 catch (Exception ex)
 {
 }
Run Code Online (Sandbox Code Playgroud)

BRA*_*mel 13

SqlException是System.Data.SqlClient.SqlException类所以你不能捕获这个异常是正常的EntityFramework DbContext.SaveChanges Method()只能抛出以下异常,因为 MSDN

DbUpdateException
DbUpdateConcurrencyException    

DbEntityValidationException 

NotSupportedException   

ObjectDisposedException 


InvalidOperationException    
Run Code Online (Sandbox Code Playgroud)

所以你可以做这样的事情

try
 { 
     db.SaveChanges();
 }
 catch (DbUpdateException ex)
 {
 }
catch (DbUpdateConcurrencyException ex)
 {
 }
Run Code Online (Sandbox Code Playgroud)

更多
上面提到的例外是实体框架自定义异常,它们只EF负责何时以及如何触发它们Implementing custom exceptions


PaR*_*RaJ 5

您无法捕获到SqlException它,因为它不是直接抛出的,而是被设置为的内部异常DbUpdateException

实体框架是与数据库一起使用的抽象,它不直接依赖于任何数据库技术。

看看由抛出的异常 DbContext.SaveChanges()