2012-04-14 223 views
0

當我有一個例外,我不知道究竟是什麼錯誤或什麼是我應該做的正確刪除對象無一例外所以這是我有問題的功能:刪除實體框架對象

protected void RemoveAddDrugSurg() 
{ 
    Surgery sur; 
    DrugsList drug; 
    Surgery surObject; 
    DrugsList drugObject; 
    try 
    { 
     if (Session["OldSurgs"] != null) 
     { 
      var SurgList = Session["OldSurgs"] as List<Surgery>; 
      if (SurgList.Count > 0) 
      { 

       foreach (ListItem li in chlSurg.Items) 
       { 
        surObject = null; 
        Int64 index = Convert.ToInt64(li.Value); 
        surObject = SurgList.Find(s => s.SurgeryID == index); 
        if (surObject == null && li.Selected) 
        { 
         sur = new Surgery(); 
         sur.VisitID = Convert.ToInt64(Session["VID"]); 
         sur.SurgeryID = Convert.ToInt32(li.Value); 
         Diabetes.AddToSurgeries(sur); 
        } 
        else if (surObject != null && !li.Selected) 
        { 

         Diabetes.CreateObjectSet<Surgery>().Attach(surObject); 
         Diabetes.ObjectStateManager.ChangeObjectState(surObject, EntityState.Deleted); 
        } 
       } 
       Diabetes.SaveChanges(); 
      } 
     } 
     if (Session["OldDrugs"] != null) 
     { 
      var DrugList = Session["OldDrugs"] as List<DrugsList>; 
      if (DrugList.Count > 0) 
      { 
       foreach (ListItem li in chlDrugs.Items) 
       { 
        drugObject = null; 
        Int64 index = Convert.ToInt64(li.Value); 
        drugObject = DrugList.Find(d => d.DrugID == index); 
        if (drugObject == null && li.Selected) 
        { 
         drug = new DrugsList(); 
         drug.VisitID = Convert.ToInt64(Session["VID"]); 
         drug.DrugID = Convert.ToInt32(li.Value); 
         Diabetes.AddToDrugsLists(drug); 
        } 
        else if (drugObject != null && !li.Selected) 
        { 
         Diabetes.CreateObjectSet<DrugsList>().Attach(drugObject); 
         Diabetes.ObjectStateManager.ChangeObjectState(drugObject, EntityState.Deleted); 
        } 
       } 
       Diabetes.SaveChanges(); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
} 

和出現的例外是:

IEntityChangeTracker的多個實例不能引用實體對象。

在此先感謝。

+0

你檢查了你的app.config嗎? – test 2012-04-14 08:27:25

+0

什麼?我用同樣的方式刪除其他對象,它運作良好,但現在我不知道該怎麼辦! – 2012-04-14 08:31:02

+0

並且拋出異常的哪一行?如果它在.Attach()行上,那麼你緩存SurObject仍然/已經跟蹤 – 2012-04-14 08:32:56

回答

0

您的密碼不顯示surObject來自哪裏。我的猜測是你正在嘗試將surObject附加到一個新的ObjectContext。如果'Diabetis'ObjectContext:您可能正在HTTP請求中創建它,並且surObject(來自會話)來自之前的請求。 EntityObject當前只能連接到一個ObjectCOntext。如果您想將其轉移到另一個ObjectContext,則需要先將其分離。

要刪除一個對象,你應該調用ObjectContext.DelteObject,這也應該從父集合中刪除它。

+0

我以前試過但它不起作用:) – 2012-04-14 12:23:37

+0

你沒有告訴我們什麼「不起作用」的含義。如上所述,您可能在ObjectContext實時管理方面存在問題。通常有兩種方法:每個請求一個ObjectContext實例或每個會話一個ObjectContext實例。你不應該爲每個應用使用一個對象上下文。 – matra 2012-04-14 12:36:54

+0

我在上面的評論中說過會話有問題,因爲我在所有頁面上使用了相同的上下文對象,以避免我爲每個範圍使用「使用」,這是我發現做出事情的唯一方法工作:) – 2012-04-14 12:45:22

0

最後我明白了,我對每個範圍使用了關鍵字「using」以避免會話之間的中斷。

謝謝大家的幫助:)