C# 新对象,但错误:objectstatemanager中已存在具有相同键的对象。objectstatemanager无法跟踪多个(…)
C# 新对象,但错误:objectstatemanager中已存在具有相同键的对象。objectstatemanager无法跟踪多个(…),c#,entity-framework,linq-to-entities,many-to-many,objectcontext,C#,Entity Framework,Linq To Entities,Many To Many,Objectcontext,学生和老师是我的关系多对多 当数据库中存在Student并且想要添加新的Teacher时,我尝试下面的代码 但在这方面: addedTeachers.ForEach(a=>dbStudent.Teacher.Add(a))我得到一个错误 “objectstatemanager中已存在具有相同键的对象。objectstatemanager无法跟踪具有相同键的多个对象。” 怎么了 void Update(Student s) { using(var context = new MyEntit
学生
和老师
是我的关系多对多
当数据库中存在Student
并且想要添加新的Teacher
时,我尝试下面的代码
但在这方面:
addedTeachers.ForEach(a=>dbStudent.Teacher.Add(a))代码>我得到一个错误
“objectstatemanager中已存在具有相同键的对象。objectstatemanager无法跟踪具有相同键的多个对象。”
怎么了
void Update(Student s)
{
using(var context = new MyEntities(connectionString))
{
context.ContextOptions.LazyLoadingEnabled = false;
var dbStudent = context.Student.Include("Teacher").Where(a => a.Id == s.Id).SingleOrDefault();
var dbTeachers = dbStudent.Teacher.ToList();
var newTeachers = s.Teacher.ToList();
var addedTeachers = newTeachers.Except(dbTeachers).ToList();
var deletedTeachers = dbTeachers.Except(newTeachers).ToList();
addedTeachers.ForEach(a => dbStudent.Teacher.Add(a));
deletedTeachers.ForEach(a => dbStudent.Teacher.Remove(a));
context.SaveChanges();
}
}
编辑
还有什么奇怪的:
就在此行之前,异常值为0。但异常之后是1。当然,添加了教师。计数也为1,但调试器没有到达下一行。我认为你的问题在于你的陈述。它使用默认值
比较器来比较集合项目,该比较器用于比较项目是否引用内存中的同一对象,而实际上,您希望它比较教师对象的值
解决方案是提供您自己的IEqualityComparer
,并精确指定Teacher
对象之间的比较方式。提供了一个很好的示例说明如何执行此操作。问题在于s
和dbStudent
具有相同的主键。您在s中的Teacher
实例。Teacher
集合可能引用s
实例。然后调用addedTeachers.ForEach(a=>dbStudent.Teacher.Add(a))代码>,EF将标识链接到教师实例的所有对象,并尝试添加它们
试一试
不,我有我自己的比较器,除了扩展,它工作得很好。此外,数据库或内存中没有其他教师。现在我只想补充一个…你能看看我的第二个非常类似的问题吗?
addedTeachers.ForEach(a => { a.Students.Remove(s);
a.Students.Add(dbStudent);
dbStudent.Teacher.Add(a);});