したがって、私が抱えている問題は次のとおりです。この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);
}
}
うわー、あなたのメソッドを分割すると、問題が分かりやすくなります。 1つの方法で変更を保存しますか?つまり、少なくとも7つの方法が必要です。この後、おそらく自分で問題が表示されます。 –
しかし、これについては間違いありません。私はあなたの助言を取って、私が完了したときに改訂コードを投稿します –
いくつかの改訂コードを投稿 –