插入时出现实体框架外键错误
本文关键字:错误 框架 实体 插入 | 更新日期: 2023-09-27 18:36:21
我们有一个使用实体框架的MVC项目,其中有三个表,一个类表,一个学生表和一个教师表。教师和学生表与班级表的关系按CLASS_ID。我们正在尝试制作一个班级的副本,并将其与教师和学生一起插入数据库。
public void MakeClassCopy(int classID){
var copiedClass = database.TABLE_CLASS.Where(x => x.ID == classID).First();
var students = copiedClass.TABLE_STUDENTS.ToList(); //Lines that cause the exception
var teachers = copiedClass.TABLE_TEACHERS.ToList(); //Lines that cause the exception
database.TABLE_CLASS.Add(copiedClass);
database.SaveChanges();
string newTableID = copiedClass.ID;
//Insert students and teachers with new CLASS_ID here
}
如果我们省略有问题的行,此方法有效,但是当像这样执行时,我们得到一个运行时异常,说
"The changes to the database were committed successfully, but an error occurred while updating the object context. The ObjectContext might be in an inconsistent state. Inner exception message: A referential integrity constraint violation occurred: The property value(s) of 'TABLE_CLASS.ID' on one end of a relationship do not match the property value(s) of 'TABLE_STUDENTS.CLASS_ID' on the other end."
为什么我们只通过定义两个变量得到这个错误?我们甚至不会在任何其他代码中使用它们。
通过选择"copiedClass"的学生和教师,您实际上是在选择具有class_id"classId"的班级的学生和教师进入数据库上下文。这些对象保留在内存中。
接下来,您可能会更改这些对象的class_id,并将它们插入到数据库中。在插入完成并且缓存尝试更新之前,一切都很好。此缓存具有对所有这些提取对象的引用,但具有不同的class_id。
您使用 ToList 获取的学生现在已链接到另一个班级,这与上下文不一致。
复制对象时,您有 2 个清理选项:
1. 创建新对象,复制先前对象的属性并插入它们
或
2. 使用第一个上下文获取对象,使用第二个上下文插入新对象