Ошибка ограничения внешнего ключа, возникающая при наличии данных в связанной таблице - PullRequest
0 голосов
/ 07 мая 2019

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

System.Data.Entity.Infrastructure.DbUpdateException: произошла ошибка при обновлении записей. Смотрите внутреннее исключение для деталей. ---> System.Data.Entity.Core.UpdateException: ошибка произошла во время Обновление записей. Смотрите внутреннее исключение для деталей. ---> System.Data.SqlClient.SqlException: оператор INSERT конфликтовал с ограничением FOREIGN KEY "FK_tasks_role_id". Конфликт произошла в базе данных «отредактировано», таблица «dbo.roles», столбец «id».

В рамках нашей работы по регистрации / разбивке ошибок мы получаем сериализованный объект данных, которые мы пытаемся сохранить. При просмотре объекта идентификатор роли, который пытается сохранить, существует в таблице dbo.roles, поэтому не имеет смысла выдавать эту ошибку.

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

Есть ли в EF6 что-то еще, что могло вызвать эту ошибку?


Другие вещи, которые я проверял:

  • Типы данных совпадают между таблицами и кодом
  • Нет каскадного обновления или удаления
  • Нет триггеров

Создать скрипт для ограничения

ALTER TABLE [dbo].[tasks]  WITH CHECK ADD  CONSTRAINT [FK_tasks_role_id] FOREIGN KEY([role_id])
REFERENCES [dbo].[roles] ([id])
GO

ALTER TABLE [dbo].[tasks] CHECK CONSTRAINT [FK_tasks_role_id]
GO

EF код:

 public int InsertTask(Task task)
{
    var newTask = new task();
    newTask.role_id = task.Role.Id;
    newTask.name = task.Name;

    _dbEntities.tasks.Add(newTask);
    _dbEntities.SaveChanges();  

    return newTask.id;
}

1 Ответ

0 голосов
/ 09 мая 2019

Эта ошибка возникает, если вы пытаетесь вставить задачу с неправильными (отсутствующими) ролями. Ид. Пожалуйста, проверьте, содержит ли ваша база данных выбранные роли. Ид.

...