Дубликат ключевого исключения Entity Framework

Итак, у меня возникла проблема с перехватом исключения для добавления новой записи в базу данных.

Я использую Entity Framework

Дубликат ключевого исключения Entity Framework

Вот мой код:

public void AddNewStandardEngineeredModel(StandardEngineeredModel model)
    {
        using (context = new LabelPrintingContext())
        {

            try
            {
                context.EngineeredModels.Add(model);
                context.SaveChanges();
            }
            catch (SqlException ex)
            {
                if (ex.Number == 2601)
                {
                    //Violation of primary key. Handle Exception
                }
                else throw;
            }
        }
    }

Я также пробовал следующее:

 public void AddNewStandardEngineeredModel(StandardEngineeredModel model)
    {
        using (context = new LabelPrintingContext())
        {

            try
            {
                context.EngineeredModels.Add(model);
                context.SaveChanges();
            }
            catch (UpdateException ex)
            {
                var sqlException = ex.InnerException as SqlException;

                if (sqlException != null && sqlException.Errors.OfType<SqlError>()
                    .Any(se => se.Number == 2601))
                {

                    // it's a dupe... do something about it
                }
                else
                {
                    // it's something else...
                    throw;
                }
            }
        }
    }

Если я просто поймаю (Exception Ex), он перехватит исключение, но я хочу проверить число, чтобы лучше ответить моему пользователю. Таким образом, если будет добавлен дубликат, я могу сообщить им об этом и исправить его соответствующим образом.

Вот изображение ошибки:

Дубликат ключевого исключения Entity Framework

Не совсем уверен, что еще попытаться поймать конкретное исключение. Любые предложения помогут.

по крайней мере, скажите, какой у вашего model первичный ключ, это Identity? похоже, что в вашей логике есть ошибка. прошивка (заливка) ID.

ahmad molaie 10.07.2018 22:12
Я хочу проверить номер, чтобы лучше ответить моему пользователю. Таким образом, если будет добавлен дубликат, я могу сообщить им об этом и исправить его соответствующим образом. Простой. Не позволяйте пользователям указывать первичный ключ.
stuartd 10.07.2018 22:31

Первичный ключ - это строка. Номер модели - это первичный ключ. Я просто хочу знать, как обрабатывать исключение.

Eric Obermuller 10.07.2018 22:31

Ну, я не хочу дублировать номера моделей в базе данных, поэтому установка номера моей модели в качестве первичного ключа будет иметь наибольший смысл.

Eric Obermuller 10.07.2018 22:32

Мне просто интересно, почему исключение не перехватывается этими операторами catch (), а не о том, какой у меня первичный ключ и т. д., Я знаю, что первичный ключ является дубликатом, проблема заключается в том, как работает программа, она попытается добавить модель, если возникает исключение Duplicate key, вместо того, чтобы пытаться добавить его, я хочу спросить пользователя, хотят ли они вместо этого обновить запись.

Eric Obermuller 10.07.2018 22:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
969
1

Ответы 1

При использовании ORM SqlException часто будет обернутым, иногда довольно сильно вложенным. Итак, вам нужна вспомогательная функция, чтобы пройти по дереву исключений и найти SqlException (если оно есть):

    static SqlException GetSqlException(Exception exception)
    {
        if (exception is SqlException sqlException) return sqlException;
        return exception.InnerException == null ? null : GetSqlException(exception.InnerException);
    }

Затем вы можете использовать любую стратегию, которая вам нравится, для перехвата, сколь угодно детализированного, исключения и обработки исключения SqlException, если оно обнаружено. например на основе вашего кода:

public void AddNewStandardEngineeredModel(StandardEngineeredModel model)
{
    using (context = new LabelPrintingContext())
    {

        try
        {
            context.EngineeredModels.Add(model);
            context.SaveChanges();
        }
        catch (Exception ex)
        {
            var sqlException = GetSqlException(ex);

            if (sqlException != null && sqlException.Errors.OfType<SqlError>()
                .Any(se => se.Number == 2601))
            {

                // it's a dupe... do something about it
            }
            else
            {
                // it's something else...
                throw;
            }
        }
    }
}

Это прекрасно, спасибо. Отлично получилось. Это как-то раздражает, что исключение так завёрнуто. Прошел через это примерно 4 раза, прежде чем нашел исключение, которое я хотел.

Eric Obermuller 11.07.2018 02:54

Другие вопросы по теме