Tengo Entity Framework configurado para actualizar una tabla. La actualización es interceptada por un lugar de gatillo, que llama a RAISERROR:¿Cómo capturo una SqlException lanzada por RAISERROR llamada en un desencadenador desencadenado por Entity Framework 4?
CREATE TRIGGER mySchema.UpdateBusinessObjects
ON mySchema.BusinessObjects
INSTEAD OF UPDATE
AS
RAISERROR(''test error from SQL'',16,1)
RETURN
En mi clase de repositorio, Estoy intentando coger el SqlException generada por el RAISERROR en SQL:
public void SaveBusinessObject(BusinessObject b) {
try {
repo.Entry(b).State = EntityState.Modified;
repo.SaveChanges();
} catch (SqlException ex) {
// handle exception here
}
}
la el problema es que C# no está atrapando la SqlException; se pasa a la persona que llama como una excepción no controlada ("SqlException no fue controlada por el usuario: error de prueba de SQL"). ¡¿Qué?!
Parece que SaveChanges() de EF está pasando la excepción por encima de mi bloque try catch. He intentado cambiar mi declaración catch por catch (Exception ex) en caso de que la excepción EF sea de alguna manera más general, pero aún recibo una SqlException no controlada. ¿Me estoy perdiendo algo simple aquí? ¿Cuál es el problema con el método SaveChanges()?
Pruebe con una captura vacío sólo para ver lo que sucede –
Al parecer, en esta situación que se muestran 2 excepciones cuando está en modo de depuración en Visual Studio: el primero es un "System.Data.SqlClient.SqlException" que es no captado por * any * declaración de tipo "catch()". El segundo es un "System.Data.Entity.Infrastructure.DbUpdateException" capturado por .NET y contiene el primero como InnerException. Sin embargo, solo esto último causa la caída de .NET: el primero se ignora. ¿Podría ser que el primero proviene de un proceso externo, como el servidor SQL? – rocketmonkeys