插入的实体框架外键错误

时间:2015-01-06 14:14:15

标签: c# entity-framework foreign-keys foreign-key-relationship

我们有一个使用Entity FrameWork的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."

为什么我们只通过定义两个变量来获得此错误?我们甚至不在任何其他代码中使用它们。

1 个答案:

答案 0 :(得分:3)

通过选择“复制课程”的学生和教师,您实际上正在选择课程类别为class_id' classId'进入数据库上下文。那些物体留在记忆中 接下来,您可能会更改这些对象的class_id,并将它们插入到数据库中。一切顺利,直到插入完成并且缓存尝试更新。此缓存具有对所有这些获取对象的引用,但具有不同的class_id 您使用ToList获取的学生现在已链接到另一个类,并且与上下文不一致。

复制对象时,您有2个干净的选项:
 1.创建新对象,复制先前对象的属性并插入它们 OR
 2.使用第一个上下文来获取对象,使用第二个上下文来插入新对象