【问题标题】:New object, but error: an object with the same key already exists in the objectstatemanager. the objectstatemanager cannot track multiple (...)新对象,但错误:objectstatemanager 中已存在具有相同键的对象。 objectstatemanager 无法跟踪多个 (...)
【发布时间】:2012-09-09 09:55:12
【问题描述】:

StudentTeacher是我的关系many-to-many

当我有Student 存在于数据库中,并想添加新的Teacher,我尝试下面的代码。

但符合要求: addedTeachers.ForEach(a => dbStudent.Teacher.Add(a));我收到错误

an object with the same key already exists in the objectstatemanager. the objectstatemanager cannot track multiple objects with the same key”。

怎么了?

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

编辑

还有什么奇怪的:

就在这一行之前,异常dbStudent.Teacher.Count为0。但在异常之后为1。当然addedTeachers.Count也是1,但调试器没有到达下一行。

【问题讨论】:

    标签: c# entity-framework linq-to-entities many-to-many objectcontext


    【解决方案1】:

    问题是sdbStudent 具有相同的主键。 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);});
    

    【讨论】:

    【解决方案2】:

    我认为你的问题是你的Except 声明。它使用Default 比较器比较您的集合项目,当您实际打算比较Teacher 对象的值时,该比较器会比较这些项目是否引用内存中的同一对象。

    解决方案是提供您自己的IEqualityComparer 并准确指定Teacher 对象应如何相互比较。 MSDN 提供了一个很好的例子来说明如何做到这一点。

    【讨论】:

    • 不,我有我自己的比较器,除了扩展,它工作得很好。此外,数据库或内存中没有其他教师。现在只有一个我想添加...
    猜你喜欢
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多