Entity Framework 插入外键错误

Entity Framework Foreign Key Error with Insert

我们有一个使用 Entity FrameWork 的 MVC 项目,其中我们有三个 table、一个 class table、一个学生 table 和一个老师 table。师生table通过CLASS_ID与classtable建立了关系。我们正在尝试制作一个 class 的副本,并将其与其教师和学生一起插入到数据库中。

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 和 class_id 'classId' 的学生和教师选择到数据库上下文中。这些对象保留在内存中。
接下来,您可能会更改这些对象的 class_id,并将它们插入到数据库中。一切都很好,直到插入完成并且缓存尝试更新。此缓存具有对所有这些已提取对象的引用,但具有不同的 class_id。
您使用 ToList 获取的学生现在链接到另一个 class,这与上下文不一致。

复制对象时,您有 2 个清理选项:
1. 创建新对象,复制之前对象的属性并插入
或者
2. 使用第一个上下文获取对象,使用第二个上下文插入新对象