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()?
Provare con una presa vuota solo per vedere cosa succede –
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