gpt4 book ai didi

c# - 插入 Entity Framework 外键错误

转载 作者:行者123 更新时间:2023-11-30 22:01:19 25 4
gpt4 key购买 nike

我们有一个使用 Entity FrameWork 的 MVC 项目,其中有三个表,一个类(class)表,一个学生表和一个教师表。师生表通过CLASS_ID与类(class)表建立关系。我们正在尝试制作一个类(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_id 为“classId”的类(class)学生和教师。这些对象保留在内存中。
接下来,您可能会更改这些对象的 class_id,并将它们插入到数据库中。一切都很好,直到插入完成并且缓存尝试更新。此缓存引用了所有这些获取的对象,但具有不同的 class_id。
您使用 ToList 获取的学生现在链接到另一个类(class),这与上下文不一致。

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

关于c# - 插入 Entity Framework 外键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27800509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com