首页 > 解决方案 > 相关表中存在数据时抛出外键约束错误

问题描述

我们有两个表,任务和角色,其中任务具有角色的外键。在我们的应用程序中,我们间歇性地收到此错误:

System.Data.Entity.Infrastructure.DbUpdateException:更新条目时出错。有关详细信息,请参阅内部异常。---> System.Data.Entity.Core.UpdateException:更新条目时出错。有关详细信息,请参阅内部异常。---> System.Data.SqlClient.SqlException:INSERT 语句与 FOREIGN KEY 约束“FK_tasks_role_id”冲突。冲突发生在数据库“redacted”、表“dbo.roles”、列“id”中。

作为我们的错误记录/splunk 的一部分,我们得到了一个我们试图保存的数据的序列化对象。查看对象时,尝试保存的角色 id 存在于 dbo.roles 表中,因此抛出此错误没有意义。

该错误似乎是分批出现的,持续几秒钟,然后又恢复正常。此外,它发生在多个角色 id 中,所有这些都存在于角色表中。

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

英孚代码:

 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;
}

标签: c#entity-framework-6sql-server-2016

解决方案


如果您尝试插入具有错误(缺少)roles.Id 的任务,则会发生此错误。请检查您的数据库是否包含选定的角色.Id。


推荐阅读