2012-04-14 79 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”以避免会话之间的中断。

谢谢大家的帮助:)