Utilizo Entity Framework para acceder a mis datos SQL. Tengo algunas limitaciones en el esquema de la base de datos y me pregunto cómo manejar las excepciones que son causadas por estas restricciones.Entity Framework: cómo manejar adecuadamente las excepciones que se producen debido a restricciones de SQL
Como ejemplo, aparece la siguiente excepción en un caso en el que dos usuarios intentan agregar una entidad (casi) idéntica a la base de datos al mismo tiempo.
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."
¿Cómo puedo detectar adecuadamente esta excepción específica?
solución sucia:
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;
}
}
Ahora bien, aunque este enfoque funciona, tiene algunos inconvenientes:
- Sin la seguridad de tipos: El código depende del mensaje de excepción que contiene el nombre de la columna única
- La dependencia de las clases SQLClient (abstracción roto)
¿Conoce una mejor solución para esto? Gracias por todos los comentarios ..
Nota: no quiero que codificar manualmente las limitaciones dentro de la capa de aplicación, quiero tener en la base de datos.
Bien, pero incluso si uso esta identificación, tengo que analizar el mensaje de excepción para el nombre de la columna. – driAn
@driAn: correcto. SQL tampoco tiene un mecanismo nativo para explorar a qué restricción o columna, lo que significa que tampoco hay una API o tal para leerlo. – gbn