2016-04-06 3 views
1

したがって、私が抱えている問題は次のとおりです。このif文に入ると、ClearDbInstallForGroupAndHeader()ですべてのエントリを削除して、InstallationBOMテーブルから削除します。次に、NewInstallationBoms内のすべてのエントリをInstallationBOMテーブルに追加し、この総コストの計算中にこの行に追加する場合はdb.InstallationBOMs.Add(newInstallationBom);、次のエラーが発生します。
エンティティオブジェクトは、IEntityChangeTrackerの複数のインスタンスで参照できません。dbContext IEntityChangeTrackerの複数のインスタンスでエンティティオブジェクトを参照することはできません

if (InstallationSelected) 
{ 
     bool newEntry = true; 
     if (SelectedQuoteDetails != null) 
     { 
      QuoteDetail theQuoteDetail = SelectedQuoteDetails.FirstOrDefault(X => X.GroupNr == groupID && X.LineType == "I"); 
      if (theQuoteDetail != null) 
      { 
       this.ClearDbInstallForGroupAndHeader(); 
       int position = SelectedQuoteDetails.IndexOf(theQuoteDetail); 
       newEntry = false; 
       theQuoteDetail.Quantity = InstallQty; 
       theQuoteDetail.UnitCost = InstallCost; 
       theQuoteDetail.UnitPrice = InstallPrice; 
       SelectedQuoteDetails[position] = theQuoteDetail; 

       db.QuoteDetails.Attach(theQuoteDetail); 
       db.Entry(theQuoteDetail).State = EntityState.Modified; 
       db.SaveChanges(); 

       decimal totalInstallationCost = 0; 
       totalInstallationCost = AddInstallToDbCalcTotalCost(theQuoteDetail.Line.Value, groupID); 

       newLines.UnitCost = totalInstallationCost; 
       newLines.UnitPrice = newLines.UnitCost * (1 + (Settings.MarginPercentage/100)); 

       InstallCost = newLines.UnitCost ?? 0; 
       InstallPrice = newLines.UnitPrice ?? 0;           

       RaisePropertyChanged(() => SelectedQuoteDetails); 

      } 
     } 
    } 

    public void ClearDbInstallForGroupAndHeader() 
    { 
     try 
     { 
      using (QuoteConfiguratorEntities db = Utilities.GetContext()) 
      { 
       List<InstallationBOM> dbList = db.InstallationBOMs.Where(x => x.QuoteHeaderId == this.SelectedQuoteHeader.ID && x.GroupNr == this.SelectedGroup.ID) 
                 .ToList(); 
       foreach (InstallationBOM existingInstallationBom in dbList) 
       { 
        db.InstallationBOMs.Remove(existingInstallationBom); 
       } 
       db.SaveChanges(); 
      } 

     } 
     catch (Exception ex) 
     { 
      this.Message = ex.Message + "\n\n" + ex.StackTrace; 
      this.ShowErrorMessage(); 
     } 
    } 

    public decimal AddInstallToDbCalcTotalCost(decimal pLine, long pGroupNr) 
    { 
     decimal totalInstallationCost = 0; 
     try 
     { 
      using (QuoteConfiguratorEntities db = Utilities.GetContext()) 
      { 
       foreach (InstallationBOM newInstallationBom in this.NewInstallationBoms) 
       { 
        newInstallationBom.QuoteHeaderId = this.SelectedQuoteHeader.ID; 
        newInstallationBom.GroupNr = pGroupNr; 
        newInstallationBom.LineNumber = pLine; 
        totalInstallationCost += (newInstallationBom.Quantity.Value * 
               newInstallationBom.Cost.Value); 
        db.InstallationBOMs.Add(newInstallationBom);      
        db.SaveChanges(); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      this.Message = ex.Message + "\n\n" + ex.StackTrace; 
      this.ShowErrorMessage(); 
     } 
     return totalInstallationCost; 
    } 

public void OpenInstallationOptionsWindow(bool AsThread = false) 
    { 
     try 
     { 
      if (AsThread) 
      { 
       this.Busy = true; 
       this._Thread = new Thread(() => QuoteConfiguratorViewModel.OpenInstallationOptionsWindow(this)); 
       this._Thread.IsBackground = true; 
       this._Thread.Start(); 
      } 
      else 
      { 
       using (QuoteConfiguratorEntities db = Utilities.GetContext()) 
       { 
        ObservableCollection<InstallationBOM> installBomListGroup = new ObservableCollection<InstallationBOM>(db.InstallationBOMs.Where(x => x.QuoteHeaderId == this.SelectedQuoteHeader.ID 
         && x.GroupNr == this.SelectedGroup.ID).ToList()); 
        if (installBomListGroup != null) 
        { 
         if (!installBomListGroup.Any()) 
         { 
          ClearInstallationBomEntry(); 
          NewInstallationBoms = new ObservableCollection<InstallationBOM>(); 
         } 
         else if (installBomListGroup.Any()) 
         { 
          NewInstallationBoms = installBomListGroup; 
         } 
        }       

        Messenger.Default.Send<OpenInstallationWindow>(new OpenInstallationWindow()); 

       } 

      } 
     } 
     catch (Exception ex) 
     { 
      this.Message = Utilities.GetError(ex); 
     } 
    } 
+2

うわー、あなたのメソッドを分割すると、問題が分かりやすくなります。 1つの方法で変更を保存しますか?つまり、少なくとも7つの方法が必要です。この後、おそらく自分で問題が表示されます。 –

+1

しかし、これについては間違いありません。私はあなたの助言を取って、私が完了したときに改訂コードを投稿します –

+0

いくつかの改訂コードを投稿 –

答えて

2

問題がNewInstallationBomsコンテキストに取り付けられています。しかし、あなたはAddInstallToDbCalcTotalCostの別の文脈でそれらを追加しようとします。

解決策1:同じコンテキストを使用する必要があります。詳細answer

解決策2:まず、最初のコンテキストでそれらを切り離し、2番目のコンテキストでそれらを接続する必要があります。詳細answer

解決策3(クレジット番号grek40):AsNoTracking()を最初の文脈で使用する場合。それは追跡/キャッシュされません。したがって、2番目のコンテキストで安全に使用できます。

解決策1の方が良いです。依存性注入コンテナを使用する場合は、リクエストごとにdbcontextを作成できます。 これ以外にも、上位レベルのdbcontextのライフタイムを管理することも、クラスを使い捨てにして、クラス内のdbコンテキストを管理することもできます。

+1

解決策3: 'AsNoTracking()'によるクエリ – grek40

関連する問題