簡體   English   中英

新對象,但錯誤:對象狀態管理器中已經存在具有相同鍵的對象。 objectstatemanager無法跟蹤多個(…)

[英]New object, but error: an object with the same key already exists in the objectstatemanager. the objectstatemanager cannot track multiple (…)

我與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,但調試器不會到達下一行。

問題是sdbStudent具有相同的主鍵。 s.Teacher集合中的Teacher實例s.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);});

我認為您的問題是您的Except聲明。 它使用Default比較器比較收集項目, Default比較器進行比較,以在您實際打算比較存儲對象與教師對象的值時查看這些項目是否引用了內存中的同一對象。

解決方案是提供您自己的IEqualityComparer並准確指定Teacher對象之間的比較方式。 MSDN提供了一個很好的例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM