错误:ObjectStateManager中已存在具有相同键的对象。 ObjectStateManager无法使用相同的键跟踪多个对象

时间:2013-12-20 21:54:36

标签: c# entity-framework

我是实体框架的新手。

我在这个网站和谷歌上搜索过,然后才问这个问题,到处都找到了不同的答案。但我的问题没有解决,所以我问这个问题。

我在尝试删除记录时遇到上述错误。

这是我的代码:

using (Lab_Lite_Entities db = new Lab_Lite_Entities())


{

     var HaemogramsCorrespondingToPatient = (from h in db.Haemograms
                                             join m in db.MasterPatientHaemograms
                                             on h.HaemogramID equals m.HaemogramID
                                             where m.PatientID == SelectedPatient.PatientID
                                             select h);
     foreach (Haemogram haemogram in HaemogramsCorrespondingToPatient)
     {
          if (db.Entry(haemogram).State == System.Data.EntityState.Detached)
              db.Haemograms.Attach(haemogram);
          db.Haemograms.Remove(haemogram);
          db.Entry(haemogram).State = EntityState.Deleted;
     }

     var entry = db.Entry(SelectedPatient);
     if (entry.State == System.Data.EntityState.Detached)
         db.Patients.Attach(SelectedPatient); //I get error here
     db.Patients.Remove(SelectedPatient);
     db.SaveChanges();
}

以下是表格之间的关系:

enter image description here

注意:请注意,在sql server中启用了级联删除。

修改

我也发现了一些奇怪的事情。

当我创建患者然后尝试使用上述代码删除CurrentPatient对象时,我得到上述错误。

但是当我创建一个病人然后重新启动程序然后我尝试删除CurrentPatient对象时,它会被删除而没有任何问题。

1 个答案:

答案 0 :(得分:2)

我只能想象如果SelectedPatient包含MasterPatientHaemogram类型的引用对象,并且这些对象再次引用类型为Haemogram的对象,则会发生此错误。当您附加SelectedPatient(显然是一个分离的实体)时,将附加整个对象图,包括Haemogram个对象,这些对象可能与您在HaemogramsCorrespondingToPatient的查询中已加载的密钥相同。这会导致异常。

最简单,最安全的解决方案是不要尝试附加分离的SelectedPatient,而是从数据库加载副本并删除此实体:

//...
var patient = db.Patients.Find(SelectedPatient.PatientID);
db.Patients.Remove(patient);
db.SaveChanges();

如果您不想使用Find查询数据库,只需使用正确的密钥创建存根实体:

//...
var patient = new Patient { PatientID = SelectedPatient.PatientID };
db.Patients.Attach(patient);
db.Patients.Remove(patient);
db.SaveChanges();