2012-04-14 4 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

+0

무엇을 위해? 나는 다른 방법을 사용하여 다른 물체를 삭제했지만 잘 작동했지만 지금은 무엇을 해야할지 모르겠다. !!!! –

+0

그리고 어떤 줄에 예외가 발생합니까? 해당 .Attach() 줄에 다음 surObject 캐시 된 여전히/이미 추적 된 –

답변

0

surObject의 코드가 표시되지 않습니다. 내 생각 엔 당신이 surObject를 새로운 ObjectContext에 붙이려고한다는 것입니다. 'Diabetis'ObjectContext : HTTP 요청에서 생성하고 surObject (세션에서)를 이전 요청에서 가져온 것일 수 있습니다. EntityObject는 한 번에 하나의 ObjectCOntext에만 첨부 할 수 있습니다. 이를 다른 ObjectContext로 전송하려면 먼저 분리해야합니다.

개체를 deligate하려면 ObjectContext.DelteObject을 호출해야합니다. 또한이 개체를 부모 컬렉션에서 제거해야합니다.

+0

전에 시도한 적이 있지만 작동하지 않습니다. –

+0

"작동하지 않는다"는 것을 말하지 않았습니다. 위에서 설명한 것처럼 ObjectContext 라이브 타임 관리에 문제가있을 수 있습니다. 일반적으로 요청 당 하나의 ObjectContext 인스턴스 또는 세션 당 하나의 ObjectContext 인스턴스라는 두 가지 접근 방식이 있습니다. 응용 프로그램마다 하나의 객체 컨텍스트를 사용하면 안됩니다. – matra

+0

위의 주석에서 모든 페이지에 대해 동일한 컨텍스트 개체를 사용했기 때문에 세션에 문제가 있음을 언급 했으므로 모든 범위에 대해 "사용"하는 것을 피하기 위해 이것이 내가 만드는 것을 발견 한 유일한 방법이었습니다 일 :) –

0

마지막으로 나는 각 범위에 "사용 중"이라는 키워드를 사용하여 세션 간의 간섭을 피했습니다.

감사합니다.