2012-02-24 43 views
7

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()?

+0

Pruebe con una captura vacío sólo para ver lo que sucede –

+0

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

Respuesta

0

La única manera que conozco de tener una excepción para evitar una captura de prueba es tener la excepción en un hilo diferente. ¿Podría el código EF ejecutarse en un hilo diferente? Tal vez puedas habilitar el lanzamiento de excepciones en 1º oportunidad en el cuadro de diálogo Excepciones.

1

Intenté casi el mismo disparador exacto que tienes en una tabla y traté de guardar el objeto correspondiente (nuevo) a través del marco de entidades. Por lo que puedo ver, la excepción lanzada es del tipo System.Data.UpdateException y no SqlException. La excepción interna es SqlException y contiene el mensaje personalizado que ha generado en el desencadenador que es 'error de prueba de SQL'. Espero que esto ayude

+0

Gracias ... el problema es que no puedo detectar la excepción incluso con el tipo de excepción más básico, así que no puedo profundizar y averiguar de qué tipo es. ¿A qué te refieres con "por lo que puedes ver"? – user941238

0

Tuve este problema exacto.

Estaba usando MVC mini profiler para consultar los tiempos de consulta. Descubrí que si lo eliminé de mi proyecto, las excepciones se detectaron como esperaba.

0

Hay 2 cosas: -

  1. Si desea RAISERROR para lanzar una SqlException, es necesario establecer su gravedad por encima de 10. Los errores con una gravedad de 10 y por debajo son informativas, y por lo tanto don' t arrojar excepciones.

  2. Captura EntityException o Establezca un punto de interrupción en el bloque catch de Exception general. En la ventana Inmediato, inspeccione el tipo de la excepción: ex.GetType();

Cuestiones relacionadas