У меня происходит странная ситуация.Когда запись сохранена, вызывается метод, который выполняет вычисления для всей иерархии уровней таблицы.
Когда этот расчет вызывается без его участия в методе POST / SAVE, все в порядке, все уровни будутбыть возвращены и рассчитаны правильно.Все объединенные записи возвращаются как System.Data.Entity.Proxies
.
. Когда вычисление вызывается из метода POST / SAVE, таблица (являющаяся нижней таблицей соединения в иерархии), на которую влияет сохраненная запись,не возвращается как тип System.Data.Entity.Proxies
.Возвращается как тип Context.Model.TableName
.
Поскольку запись для этой таблицы возвращается как Context.Model.TableName
, она не возвращает объединенные записи для этих записей.Это означает, что вычисления не выполняются.
Я полагаю, что это как-то связано с тем фактом, что таблица, которая возвращается неверно, является той же, что была сохранена перед вызовом вычисления.
Что я могу сделать, чтобы получить новую загрузку и вернуть все объединенные таблицы как System.Data.Entity.Proxies
тип из вызова в SectionItemEdit
?
Метод сохранения
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SectionItemEdit([Bind(Include = "Id,Qty,Name,Description,SectionId,Status,ProjectedEach")] SectionItem sectionItem)
{
if (ModelState.IsValid)
{
db.Entry(sectionItem).State = EntityState.Modified;
db.SaveChanges();
Section sect = db.Sections.Find(sectionItem.SectionId);
CalculateProject(sect.Project.Id);
return RedirectToAction("SectionItem", new { id = sectionItem.Id });
}
return View("SectionItemEdit", new { id = sectionItem.Id });
}
Метод расчета
private void CalculateProject(long? id)
{
Project project = db.Projects.Find(id);
if (true)
{
decimal projectTotal = 0.0m;
decimal projectedTotal = 0.0m;
foreach(Section section in project.Sections)
{
decimal sectionEach = 0.0m;
decimal sectionTotal = 0.0m;
decimal projectedEach = 0.0m;
// This is the affected table (SectionItem)
foreach (SectionItem sectionItm in section.SectionItems)
{
decimal sectionItemTotal = 0.0m;
decimal sectionItemEach = 0.0m;
SectionItem sectionItemSave = db.SectionItems.Find(sectionItm.Id);
foreach (SecItemLink secItemLink in sectionItm.SecItemLinks)
{
if(secItemLink.Used)
{
sectionItemEach += secItemLink.ItemEachCost;
sectionItemTotal += sectionItm.Qty * secItemLink.ItemEachCost;
}
else
{
sectionItemEach = 0;
sectionItemTotal = 0;
}
if (sectionItm.SecItemLinks.LastOrDefault().Equals(secItemLink))
{
sectionItemSave.ActualEach = sectionItemEach;
sectionItemSave.ActualTotal = sectionItemTotal;
}
}
sectionItemSave.ProjectedEach = sectionItm.ProjectedEach;
sectionItemSave.ProjectedTotal = sectionItm.ProjectedEach * sectionItm.Qty;
db.SaveChanges();
db.Entry(project).Reload();
projectedEach += sectionItm.ProjectedTotal;
sectionEach += sectionItemTotal;
if (section.SectionItems.LastOrDefault().Equals(sectionItm))
{
sectionTotal += sectionEach * section.Qty;
Section sectionSave = db.Sections.Find(section.Id);
sectionSave.ActualEach = sectionEach;
sectionSave.ActualTotal = sectionTotal;
sectionSave.ProjectedEach = projectedEach;
sectionSave.ProjectedTotal = projectedEach * section.Qty;
db.SaveChanges();
db.Entry(project).Reload();
}
}
projectTotal += sectionTotal;
projectedTotal += section.ProjectedTotal;
}
project.ActualCost = projectTotal;
project.ProjectedCost = projectedTotal;
db.SaveChanges();
}
}