Вы инициализируете свою orderTotal
-переменную из базы данных, а затем обновляете переменную с ценами вашего заказа - ничего не делая с переменной, кроме ее расчета. Это не меняет вашу базу данных, так как это вызов по значению для простого типа order.TotalPrice
. Я думаю, вы хотите сначала рассчитать сумму цен в заказе и потом установить ее в своей базе данных:
public IActionResult AddToCart(int itemId)
{
var product = _context.Products.Include(p => p.Item).SingleOrDefault(p => p.ItemId == itemId);
if (product != null)
{
int userId = int.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier).ToString());
var order = _context.Orders.FirstOrDefault(o => o.UserId == userId && !o.IsFinaly);
if (order != null)
{
var orderDetail =
_context.OrderDetails.FirstOrDefault(d =>
d.OrderId == order.OrderId && d.ProductId == product.Id);
if (orderDetail != null)
{
orderDetail.Count += 1;
}
else
{
// If the order detail doesnt exist before
_context.OrderDetails.Add(new OrderDetail()
{
OrderId = order.OrderId,
ProductId = product.Id,
Price = product.Item.Price,
Count = 1
});
}
}
else
{
order = new Order()
{
IsFinaly = false,
CreateDate = DateTime.Now,
UserId = userId
};
_context.Orders.Add(order);
_context.OrderDetails.Add(new OrderDetail()
{
OrderId = order.OrderId,
ProductId = product.Id,
Price = product.Item.Price,
Count = 1
});
}
decimal orderTotal = 0;
foreach (var item in order.OrderDetails)
{
orderTotal += item.Price * item.Count;
}
order.TotalPrice = orderTotal;
_context.SaveChanges();
}
return RedirectToAction("ShowCart");
}
Я также изменил: вы делаете нет необходимости вызывать SaveChanges()
несколько раз или устанавливать EntityState, если вы не получаете объект с помощью NoTracking()
. Он устанавливается автоматически.
Ваш код может нуждаться в дополнительном рефакторинге, так как он довольно избыточен, и иметь такой объем кода в вашем контроллере - не лучший стиль, но приведенные выше изменения должны решить ваши функциональные проблемы.