2014-11-21 26 views
0

我想在兩個不同的dbContext中使用相同的對象。我得到了這個錯誤如何解決這個錯誤「的ObjectContext實例已被處置,不能再用於需要連接的操作」

ObjectContext實例已被處置,不能再用於需要連接的操作。

這個錯誤的可能原因是什麼?

public string ValidateNXT_MODULE_DETAILS_PHARMACY(int id) 
{ 
    long? ValCounter = 0; 
    string prepQu = Constante.CurrentUser.LOG_USER; ; 
    DateTime dateQu = DateTime.Today; 
    NXT_MODULE_DETAILS_PHARMACY module = new NXT_MODULE_DETAILS_PHARMACY(); 

    try 
    { 
     using (CaseManagerEntities db = new CaseManagerEntities()) 
     {      
      NXT_MODULE_DETAILS_PHARMACY cmd = db.NXT_MODULE_DETAILS_PHARMACY.Find(id);      
      module = cmd; 
     }     

     using (PHStockEntities db = new PHStockEntities()) 
     { 
      using (TransactionScope t = new TransactionScope()) 
      { 
       NXT_PH_COUNTER Counter = db.NXT_PH_COUNTER.Where(nat => nat.TYPE_CHOIX == 301).First(); 
       ValCounter = Counter.Value; 
       Counter.Value = ValCounter + 1;       

       foreach (var detail in module.NXT_MODULE_DETAILS_PHARMACY_DETAIL.ToList()) 
       { 

        NXT_PH_CHOIX_MODULE choix = db.NXT_PH_CHOIX_MODULE.Where(nat => nat.TYPE_CHOIX == 301).First(); 
        NXT_ASS_ART_LOT_DEP_EC association = db.NXT_ASS_ART_LOT_DEP_EC.Where(nat => nat.ID_ARTICLE == detail.ID_LIST_PH_DET && nat.ID_LIST_DEPOT == module.DEPOT).First(); 

        decimal? QTE = 0; 
        if (choix.SIGNE_STOCK == "P") 
        { 
         QTE = detail.QTE_PH_DET; 
        } 
        else if (choix.SIGNE_STOCK == "M") 
        { 
         QTE = decimal.Negate(decimal.Parse(detail.QTE_PH_DET.ToString())); 
        } 
        switch (choix.CHAMP_STOCK) 
        { 
         case "STOCK_VENTE": 
          association.STOCK_VENTE = association.STOCK_VENTE + QTE; 
          break; 
         case "STOCK_ACHAT": 
          association.STOCK_ACHAT = association.STOCK_ACHAT + QTE; 
          break; 
         case "STOCK_MOUVEMENT": 
          association.STOCK_MOUVEMENT = association.STOCK_MOUVEMENT + QTE; 
          break; 
         case "STOCK_ETAGE": 
          association.STOCK_ETAGE = association.STOCK_ETAGE + QTE; 
          break; 
        } 
       } 

       db.SaveChanges(); 
       t.Complete(); 
      } 
     } 

     using (CaseManagerEntities db = new CaseManagerEntities()) 
     { 
      using (TransactionScope t = new TransactionScope()) 
      { 
       module.NBR_QUITTANCE = ValCounter.ToString(); 
       module.DATE_QUITTANCE = dateQu; 
       module.PREPART_QUITTANCE = prepQu; 
       module.STATUT = 3; 
       dbCaseManager.SaveChanges(); 
       t.Complete(); 
      } 
     } 
     return ValCounter.ToString() + ";" + prepQu + ";" + dateQu.Date; 
    } 
    catch (Exception e) 
    { 
     return "ERROR"; 
    }   
} 
+0

異常被拋出「的foreach(VAR詳細module.NXT_MODULE_DETAILS_PHARMACY_DETAIL.ToList())」 – 2014-11-21 09:45:54

回答

0

您正在佈置在第一使用語句CaseManagerEntities,所以導航屬性的任何進一步遲緩裝載試圖獲取使用設置上下文中的數據。解決這個問題的一種方法是急切地加載你需要的實體。假設在NXT_MODULE_DETAILS_PHARMACY主鍵是ID,試試這個:

var cmd = db.NXT_MODULE_DETAILS_PHARMACY.Include(x => x.NXT_MODULE_DETAILS_PHARMACY_DETAIL).Single(x => x.id == id); 
+0

我有這個錯誤:NXT_MODULE_DETAILS_PHARMACY不包含「包含」 – 2014-11-21 10:02:35

+0

對不起我的順序錯了,我已經更新的定義我的答案。 – 2014-11-21 10:03:29

+0

現在我得到了這個錯誤:無法將lambda表達式轉換爲鍵入'string',因爲它不是委託類型 – 2014-11-21 10:14:02

1

這段代碼...

using (CaseManagerEntities db = new CaseManagerEntities()) 
{      
    NXT_MODULE_DETAILS_PHARMACY cmd = db.NXT_MODULE_DETAILS_PHARMACY.Find(id); 
    module = cmd; 
}     

...創建module並立即部署它與連接上下文。之後,您嘗試延遲加載module的成員,這需要一個生動的上下文。

您必須將右大括號移至代碼底部,即return聲明之前。

另一個問題是,以後,你修改module,但撥打SaveChanges()dbCaseManager - 不管它是什麼,它不是用於跟蹤module上下文。因此module未保存。注意:請自己幫忙,不要使用可能直接從數據庫名稱中冒出來的這些可怕的大寫/前綴/下劃線名稱。 O/R mapper的想法是,您可以將更友好的名稱映射到這些數據庫名稱,無論出於何種原因,這些名稱通常看起來像看起來像這些怪物。

此外:這些TransactionScope s是無用的。 SaveChanges管理自己的事務:它成功或回滾它嘗試提交的所有內容。

相關問題