c# - 相关表中存在数据时抛出外键约束错误
问题描述
我们有两个表,任务和角色,其中任务具有角色的外键。在我们的应用程序中,我们间歇性地收到此错误:
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;
}
解决方案
如果您尝试插入具有错误(缺少)roles.Id 的任务,则会发生此错误。请检查您的数据库是否包含选定的角色.Id。
推荐阅读
- jenkins - 詹金斯工作中不接受用户名和密码
- html - 为什么 animate.css 仅适用于 DIV 元素
- javascript - 相同的承诺会产生两种不同的结果
- c++ - 不能引用隐式声明的函数 operator= - 它是一个已删除的函数
- apache-kafka - Apache Kafka - kafka-server-start.sh 没有开始
- python - Genshi:for循环插入换行符
- number-theory - 可被 d 整除且数字和等于 s 的最小正整数 n
- java - reactor-rabbitmq 是线程安全的吗
- java - Mojave 上缺少 MacOS Java 控制面板
- java - 如何为 postgres 数据库模式配置 JPA?