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