Я использую 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 (сломанная абстракция)
Знаете ли вы лучшее решение для этого? Спасибо за все отзывы..
Примечание: Я не хочу кодировать ограничения вручную на уровне приложения, я хочу иметь их в БД.