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);});