Я использую Entity Framework для доступа к своим данным SQL.У меня есть некоторые ограничения в схеме базы данных, и мне интересно, как обрабатывать исключения, вызванные этими ограничениями.
В качестве примера я получаю следующее исключение в случае, когда два пользователя пытаются добавить (почти) идентичныесущность к БД одновременно.
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."
Как правильно перехватить это конкретное исключение?
Грязное решение:
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;
}
}
Сейчасэтот подход работает, у него есть некоторые недостатки:
- Отсутствие безопасности типов: код зависит от сообщения об исключении, которое содержит имя уникального столбца.
- Зависимость от классов SqlCLient (сломанная абстракция)
Знаете ли вы лучшее решение для этого?Спасибо за все отзывы ..
Примечание: Я не хочу кодировать ограничения вручную на прикладном уровне, я хочу, чтобы они были в БД.