0

StudentTeacher是我的關係many-to-many新對象,但錯誤:objectstatemanager中已存在具有相同鍵的對象。 (...)

當我在數據庫中存在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,但調試器不到達下一條線。

回答

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

你能看看我的第二個非常類似的問題? http://stackoverflow.com/questions/12354046/add-item-and-update-relationship-in-transitional-table-in-many-to-many-database – Saint

0

我認爲你的問題是你的Except聲明。它使用Default比較器比較您的收集項目,比較器查看當您實際上是想要比較教師對象的值時,這些項目是否引用內存中的同一對象。

解決方法是提供您自己的IEqualityComparer並指定Teacher對象應該如何相互比較。 MSDN提供了一個很好的例子來說明如何做到這一點。

+0

不,我有自己的比較器除了擴展和它的作品好。此外,數據庫或內存中沒有其他教師。現在只有一個,我想補充... – Saint

相關問題