2013-12-20 47 views
1

我是新來的實體框架。錯誤:ObjectStateManager中已存在具有相同鍵的對象。 ObjectStateManager無法使用相同的密鑰跟蹤多個對象

我在本網站和谷歌上搜索之前,問這個問題,我到處找到不同的答案。但我的問題沒有解決,所以我問這個問題。

我在嘗試刪除記錄時遇到上述錯誤。

這裏是我的代碼:

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對象,然後它被刪除沒有任何問題。

回答

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

我試圖在我的項目中使用您的code1。現在我得到另一個錯誤。 該對象無法刪除,因爲它在ObjectStateManager中找不到。 – Khushi

+0

@Khushi:你真的使用過'db.Patients.Remove(patient)',** NOT **'db.Patients.Remove(SelectedPatient)'嗎? – Slauma

+0

對不起,現在有效。謝謝你對我很友善。 – Khushi

相關問題