Как очистить исключение базы данных - PullRequest
0 голосов
/ 29 января 2019

Код работает идеально, если пользователь не совершает ошибку, однако, если ошибка допущена, программа не аварийно завершает работу, но она не будет делать ничего другого, запрограммированного для нее.Когда я нажимаю кнопку «Добавить» еще раз, моя программа сохраняет изменения в базе данных и переходит в мой оператор catch без сохранения.Как очистить ошибку после ее перехвата, чтобы я мог добавить другого пользователя в базу данных?

Чтобы сделать ее более понятной:

Скажем, вы вводите Test, Test в textbox, как толькокак программа открыта.Вы получите это исключение

InnerException = {"Нарушение ограничения PRIMARY KEY 'PK_Users'. Невозможно вставить повторяющийся ключ в объект 'dbo.Users'. Значение дублирующегося ключа равно (Test, Test).Заявление было прекращено."}.

Если вы затем попытаетесь ввести Check, Check, вы получите исключение

InnerException = {"Нарушение ограничения PRIMARY KEY 'PK_Users'. Невозможно вставить повторяющийся ключ вобъект 'dbo.Users'. Дубликат ключевого значения (Test, Test). Оператор завершен. "}.

Если имя изменилось, почему я получаю ту же ошибку.При отладке, если вы проверяете имя, используемое в: db.Users.Add(user), оно показывает Check, Check, поэтому оно не похоже на то, что оно не меняет user.Name

try
        {
            if (addNameTextBox.Text.Trim().Length == 0 || addTitleTextBox.Text.Trim().Length == 0)
                return;
            var user = new User();
            user.Name = addNameTextBox.Text.Trim();
            user.Title = addTitleTextBox.Text.Trim();
            db.Users.Add(user);
            db.SaveChanges();
            addNameTextBox.Text = "";
            addTitleTextBox.Text = "";
            AutoCompleteNameTextBox();
        }
        catch (System.Data.Entity.Infrastructure.DbUpdateException)
        {
            databaseErrorLabel.Visible = true;
            databaseErrorLabel.Text = "User with this name is already in database";
        }

1 Ответ

0 голосов
/ 30 января 2019

Все это сводится к тому, «как откатывать добавления в EF при исключении».

Если вы не начинаете заново с нового экземпляра контекста вашей базы данных, вам нужно откатить добавление для пользователей.entity:
сохраните ссылку на добавленный объект User и установите его EntityState = EntityState.Detached в исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...