Uso Entity Framework per accedere ai miei dati SQL. Ho alcuni vincoli nello schema del database e mi chiedo come gestire le eccezioni causate da questi vincoli.Entity Framework: come gestire correttamente le eccezioni che si verificano a causa di vincoli SQL
Ad esempio, ottengo la seguente eccezione in un caso in cui due utenti tentano di aggiungere contemporaneamente un'entità (quasi) identica al DB.
System.Data.UpdateException
"An error occurred while updating the entries. See the InnerException for details."
(inner exception) System.Data.SqlClient.SqlException
"Violation of UNIQUE KEY constraint 'Unique_GiftId'. Cannot insert duplicate key in object 'dbo.Donations'.\r\nThe statement has been terminated."
Come rilevare correttamente questa specifica eccezione?
soluzione sporca:
catch (UpdateException ex)
{
SqlException innerException = ex.InnerException as SqlException;
if (innerException != null && innerException.Message.StartsWith("Violation of UNIQUE KEY constraint 'Unique_GiftId'"))
{
// handle exception here..
}
else
{
throw;
}
}
Ora, mentre questo approccio funziona, ha alcuni aspetti negativi:
- No Tipo di sicurezza: il codice dipende il messaggio di eccezione che contiene il nome del colonna unica.
- Dipendenza sulle classi SqlClient (astrazione rotto)
Sai una soluzione migliore per questo? Grazie per tutti i feedback ..
Nota: Non voglio codificare i vincoli manualmente all'interno del livello di applicazione, voglio avere loro nel DB.
Va bene, ma anche se io uso questo ID, devo analizzare il messaggio di eccezione per il nome della colonna. – driAn
@driAn: corretto. SQL non ha nemmeno un meccanismo nativo per il drill su quale vincolo o colonna, il che significa che non ci sono API o simili da leggere. – gbn