Quando invochiamo il metodo SaveChanges/SaveChangesAsync, EF Core genera i comandi SQL necessari ad aggiornare il database e, in caso di errore, solleva un'eccezione di tipo DbUpdateException che nella proprietà InnerException espone l'eccezione del provider ADO.NET. Tramite questa, possiamo indagare per scoprire quale sia stato l'errore sollevato dal database (un problema di integrità referenziale, campo not null, lunghezza tropo lunga e così via).
Tuttavia, questo modo di lavorare ci obbliga a intercettare prima l'eccezione di EF Core e poi a lavorare con la sua eccezione interna andando a leggere il codice di errore specifico del database. Se la nostra applicazione nasce per poter lavorare con database differenti, il codice diventa più complicato perchè dovremmo lavorare con i codici di errore di più tipi database.
La libreria EntityFrameworkCore.Exceptions ci viene in aiuto proprio per risolvere questo genere di problema. Una volta configurata per lo specifico tipo di database, questa libreria modifica l'eccezione sollevata da EF Core in un'eccezione specifica per il tipo di errore. Se, ad esempio, uno dei comandi SQL causa un problema di integrità referenziale, la libreria solleva una ReferenceConstraintException; se andiamo a impostare un valore null in un campo not null, la libreria solleva una CannotInsertNullException e così via. Questo approccio rende il nostro codice più semplice da gestire in quanto abbiamo un'eccezione specifica per ogni tipo di errore. Se vogliamo ulteriormente approfondire le cause del problema, nella proprietà InnerException dell'eccezione possiamo trovare l'eccezione originale del provider ADO.NET sottostante.
La librerià può essere scaricata da NuGet e si compone di un pacchetto base e di una serie di pacchetti specifici per database (che referenziano il pacchetto base). Una volta installato il package, tutto quello che dobbiamo fare per configurarlo è chiamare il metodo UseExceptionProcessor nella configurazione del DbContext.
public class MyContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseExceptionProcessor(); } } //oppure in ASP.NET in fase di startup builder.Services.AddDbContext<MyContext>(o => { o.UseExceptionProcessor(); });
Nel codice, ci basta utilizzare un blocco try/catch per gestire le eccezioni.
using (var ctx = new MyContext()) { ... try { ctx.SaveChanges(); } catch (UniqueConstraintException e) { //gestione errore } catch (CannotInsertNullException e) { //gestione errore } catch(Exception e) { //gestione errore } }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Gestione degli stili CSS con le regole @layer
Sfruttare GPT-4o realtime su Azure Open AI per conversazioni vocali
Gestire la cancellazione di una richiesta in streaming da Blazor
Selettore CSS :has() e i suoi casi d'uso avanzati
Recuperare automaticamente un utente e aggiungerlo ad un gruppo di Azure DevOps
Recuperare l'ultima versione di una release di GitHub
Estrarre dati randomici da una lista di oggetti in C#
Ordine e importanza per @layer in CSS
Utilizzare i variable font nel CSS
Utilizzare un numero per gestire la concorrenza ottimistica con SQL Server ed Entity Framework
Utilizzare l nesting nativo dei CSS
Usare le navigation property in QuickGrid di Blazor
I più letti di oggi
- Restituire un file per il download tramite ASP.NET Web API
- Inviare e-mail gratuitamente con SendGrid e Microsoft Azure
- Modificare un'immagine con il Nokia Imaging SDK in Windows Phone 8
- Implemetare lo swipe all'interno di una ListView nella Universal Windows Platform
- Community Champion Basta!Italia 2009 - Roma
- Web and Cloud Day 2015 Live - Online
- ASP.NET 3.5 Extensions in beta la settimana prossima
- Disponibile la fix GDR del .NET Framework 3.5 SP1
- Rilasciato Silverlight 3.0, Expression Blend 3 e la RC di Sketchflow
- Speciale Silverlight 4.0 RC e per Windows Phone 7 Series