2012-02-24 5 views
7

Ho impostato Entity Framework per aggiornare una tabella. L'aggiornamento è stato intercettato da un posto-di innesco, che chiama RAISERROR:Come posso rilevare una SqlException lanciata da RAISERROR chiamata in un trigger disattivato da Entity Framework 4?

CREATE TRIGGER mySchema.UpdateBusinessObjects 
ON mySchema.BusinessObjects 
INSTEAD OF UPDATE 
AS 
    RAISERROR(''test error from SQL'',16,1) 
    RETURN 

Nella mia classe repository, sto cercando di prendere lo SqlException generato dal RAISERROR in SQL:

public void SaveBusinessObject(BusinessObject b) { 
    try { 
     repo.Entry(b).State = EntityState.Modified; 
     repo.SaveChanges(); 
    } catch (SqlException ex) { 
     // handle exception here 
    } 
} 

Il il problema è che C# non sta prendendo il SqlException; viene passato al chiamante come un'eccezione non gestita ("SqlException non è stata gestita dall'utente: errore di test da SQL"). Che cosa?!

Sembra che EF SaveChanges() in qualche modo stia passando l'eccezione sopra il mio blocco catch try. Ho provato a cambiare la mia dichiarazione catch per catturare (Eccezione ex) nel caso in cui l'eccezione EF sia in qualche modo più generale, ma ottengo comunque una SqlException non gestita. Mi sto perdendo qualcosa di semplice qui? Qual è il problema con il metodo SaveChanges()?

+0

Provare con una presa vuota solo per vedere cosa succede –

+0

Sembra che in questa situazione che 2 eccezioni sono mostrati in modalità debug in Visual Studio: il primo è un "System.Data.SqlClient.SqlException" che è non catturato dall'istruzione * any * "catch()". Il secondo è un "System.Data.Entity.Infrastructure.DbUpdateException" catturato da .NET e contiene il primo come InnerException. Tuttavia, solo quest'ultimo causa l'arresto anomalo di .NET, il primo viene ignorato. Potrebbe essere che il primo provenga da un processo esterno, come il server SQL? – rocketmonkeys

risposta

0

L'unico modo in cui so di avere un'eccezione per evitare un tentativo di cattura è l'eccezione in un thread diverso. Il codice EF può essere eseguito su un thread diverso? Forse puoi abilitare il lancio di eccezioni alla 1º possibilità nella finestra di dialogo Eccezioni.

1

Ho provato quasi lo stesso trigger su un tavolo e ho provato a salvare il corrispondente oggetto (nuovo) attraverso il framework entità. Da quello che posso vedere, l'eccezione generata è del tipo System.Data.UpdateException e non SqlException. L'eccezione interna è SqlException e contiene il messaggio personalizzato che è stato generato nel trigger che è 'errore di test da SQL'. Spero che questo aiuti

+0

Grazie .. il problema è che non riesco a catturare l'eccezione anche con il tipo di eccezione più semplice, quindi non riesco a scavare e capire di che tipo si tratta. Cosa intendi per "da ciò che puoi vedere"? – user941238

0

Ho avuto questo problema esatto.

Stavo usando il mini profiler MVC per i tempi di interrogazione del profilo. Ho scoperto che se l'ho rimosso dal mio progetto, allora le eccezioni sono state catturate come mi aspettavo.

0

ci sono 2 cose: -

  1. Se si desidera RAISERROR per gettare uno SqlException, è necessario impostare la sua gravità sopra 10. Gli errori con una gravità di 10 e al di sotto sono informativo, e quindi don' t gettare eccezioni.

  2. Catch EntityException o Impostare un punto di interruzione nel blocco catch generale dell'eccezione. Nella finestra immediata, controlla il tipo di eccezione: ex.GetType();

Problemi correlati