Невозможно повторно вставить после нарушения уникального ключа - PullRequest
1 голос
/ 11 июня 2019

У меня есть следующий сценарий:

Функция бизнес-логики, использующая EF Core2, проверяет, существует ли запись. Если запись не существует, она вставляется в базу данных.

У меня есть несколько потоков, вызывающих эту функцию бизнес-логики. Что происходит:

Если функция вызывается одновременно с одними и теми же параметрами, оба экземпляра проверяют, существует ли запись - и ее нет. Таким образом, оба экземпляра вставляют одну и ту же запись.

Когда context.SaveChanges() вызывается в первом случае, все идет хорошо. Но вторая SaveChanges() выдает исключение, потому что запись уже существует (в базе данных есть уникальный индекс).

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

Как я могу реализовать это, чтобы избежать исключения?

1 Ответ

0 голосов
/ 17 июня 2019

Вместо простого добавления нового объекта в ваш блок catch, вы можете изменить существующий объект, вызвавший исключение.

foreach (var entry in _dbContext.ChangeTracker.Entries<YourEntity>().Where(e => e.State == EntityState.Added)))
{
    entry.Entity.YourProperty = newvalue;
}

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

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