Избегайте вставки повторяющихся записей в Entity Framework

У меня есть типичный сценарий, когда пользователи вводят данные, которые вставляются в базу данных 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;
}

Есть ли «более чистый» способ добиться того же, что не требует просмотра строки сообщения об ошибке?


person Biscuits    schedule 24.03.2014    source источник
comment
Более обычный способ избежать вставки повторяющихся записей может не быть вашим предпочтительным методом, но это означает, что вы можете настроить свое сообщение: stackoverflow.com/ а/18736484/150342   -  person Colin    schedule 24.03.2014
comment
Это тоже интересно. Спасибо, Колин.   -  person Biscuits    schedule 25.03.2015


Ответы (1)


Вам может понравиться метод AddOrUpdate. Исследуйте его в первую очередь. Я заметил, что эксперты предупреждают о чрезмерно усердном использовании.

  Context.Set<TPoco>().AddOrUpdate(poco);

может по-прежнему вызывать другие исключения EF\DB. Но Duplicate primary key не должен быть одним из них. Другие проблемы с ограничениями остались прежними.

person phil soady    schedule 24.03.2014