Una delle mie tabelle ha una chiave univoca e quando provo a inserire un record duplicato genera un'eccezione come previsto. Ma ho bisogno di distinguere le eccezioni chiave univoche da altre, in modo che possa personalizzare il messaggio di errore per le violazioni dei vincoli di chiave univoci.Come posso recuperare eccezioni UniqueKey Violation con EF6 e SQL Server?
Tutte le soluzioni che ho trovato on-line suggerisce di lanciare ex.InnerException
-System.Data.SqlClient.SqlException
e controllare la se Number
proprietà è pari a 2601 o 2627 come segue:
try
{
_context.SaveChanges();
}
catch (Exception ex)
{
var sqlException = ex.InnerException as System.Data.SqlClient.SqlException;
if (sqlException.Number == 2601 || sqlException.Number == 2627)
{
ErrorMessage = "Cannot insert duplicate values.";
}
else
{
ErrorMessage = "Error while saving data.";
}
}
Ma il problema è, gettando ex.InnerException
a System.Data.SqlClient.SqlException
cause errore di cast non valido poiché ex.InnerException
è in realtà un tipo di System.Data.Entity.Core.UpdateException
, non System.Data.SqlClient.SqlException
.
Qual è il problema con il codice sopra? Come posso rilevare le violazioni del vincolo di chiave univoco?
Dopo aver controllato il codice che hai condiviso, ora posso vedere che il problema con il mio codice è così ovvio. Dovrei scrivere "ex.InnerException.InnerException as SqlException" anziché "ex.InnerException as SqlException". –
C'è un modo per rilevare anche su quale violazione di colonna si è verificata? Potrebbero esserci più chiavi univoche in una tabella ... – Learner
@Learner L'unico modo in cui posso pensare sarebbe quello di analizzare il messaggio di errore (che indica il nome del vincolo/colonna), ma non sarebbe un ottimo soluzione (i messaggi di errore potrebbero essere aggiornati in futuro, e più importante, sono tradotti in più lingue) – ken2k