изменение общей стоимости корзины asp. net core - PullRequest
1 голос
/ 04 августа 2020

У меня есть проект для магазина, в котором проблема с корзиной.

Когда кто-то добавляет новый заказ в корзину, я хочу, чтобы он изменил общую цену в базе данных; однако у меня возникают некоторые проблемы с расчетами.

это код в контроллере

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)
        {
            decimal orderTotal = order.TotalPrice;
            var orderDetail =
                _context.OrderDetails.FirstOrDefault(d =>
                    d.OrderId == order.OrderId && d.ProductId == product.Id);
            if (orderDetail != null)
            {
                orderDetail.Count += 1;
                foreach (var item in order.OrderDetails)
                {
                    orderTotal += item.Price * item.Count;
                }

                _context.Entry(order).State = EntityState.Modified;
                _context.SaveChanges();
            }
            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
                });
                foreach (var item in order.OrderDetails)
                {
                    orderTotal += item.Price * item.Count;
                }

                _context.Entry(order).State = EntityState.Modified;
                _context.SaveChanges();

            }
        }
        else
        {
            order = new Order()
            {
                IsFinaly = false,
                CreateDate = DateTime.Now,
                UserId = userId
            };
            _context.Orders.Add(order);
            _context.SaveChanges();
            _context.OrderDetails.Add(new OrderDetail()
            {
                OrderId = order.OrderId,
                ProductId = product.Id,
                Price = product.Item.Price,
                Count = 1
            });
        }

        _context.SaveChanges();
    }
    return RedirectToAction("ShowCart");
}

1 Ответ

3 голосов
/ 04 августа 2020

Вы инициализируете свою 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(). Он устанавливается автоматически.

Ваш код может нуждаться в дополнительном рефакторинге, так как он довольно избыточен, и иметь такой объем кода в вашем контроллере - не лучший стиль, но приведенные выше изменения должны решить ваши функциональные проблемы.

...