У меня есть типичный сценарий, когда пользователи вводят данные, которые вставляются в базу данных SQL с помощью Entity Framework 6.0. Однако некоторые строки, являющиеся частью объекта, должны быть уникальными (уже введены ограничения уникальности ключа в базе данных).
Чтобы избежать возможных проблем с параллелизмом или производительностью, я предпочитаю, чтобы эти проверки выполнял SQL Server.
При попытке сохранить новую сущность, содержащую повторяющуюся строку, Entity Framework создает исключение DbUpdateException. Внутреннее исключение — это SqlException с номером, равным 2627, и сообщением следующего содержания:
«Нарушение ограничения UNIQUE KEY« UK_MyTable_MyRule ». Невозможно вставить дубликат ключа в объект« dbo.MyTable »».
Учитывая, что задействовано несколько таблиц, каждая из которых может иметь свои собственные уникальные ограничения, не существует ли лучшего способа заключить более дружественное сообщение для пользователя, которое гласит:
«MyEntity с именем MyEntity1 уже существует».
... без необходимости выводить это через свойства Number и Message из SqlException?
Например:
try
{
...
context.SaveChanges();
}
catch (DbUpdateException exception)
{
var sqlException = exception.InnerException as SqlException;
bool isDuplicateInMyTable3 =
sqlException != null &&
sqlException.Number = 2627/*Unique Constraint Violation*/ &&
sqlException.Message.Contains("'UK_MyTable3_");
if (isDuplicateInMyTable3)
{
return "A MyTable3 with " + ... + " already exists.";
}
throw exception;
}
Есть ли «более чистый» способ добиться того же, что не требует просмотра строки сообщения об ошибке?