System.InvalidOperationException: „An entity object cannot be referenced by multiple instances of IEntityChangeTracker.”

0

Cześć co to jest za błąd i jak go naprawić wyskauje mi wtedy kiedy chce dodać nowe zamówienie do bazy

using Sklep.Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Web;

namespace Sklep.Infrastructure
{
    public class OrderManager
    {
        private ISessionManager session;
        private ApplicationDbContext db = new ApplicationDbContext();

        public OrderManager(ISessionManager session)
        {
            this.session = session;
           
            
        }

        public const string sessionKey = "BasketKey";


        public List<OrderItems> GetBasket()
        {
            List<OrderItems> basket;

            if(session.Get<List<OrderItems>>(sessionKey)==null)
            {
                basket = new List<OrderItems>();
            }
            else
            {
                basket = session.Get<List<OrderItems>>(sessionKey) as List<OrderItems>;
            }
            return basket;
        }

        public void AddToBasket(int productId)
        {
            var basket = GetBasket();
            var basketItem = basket.Find(x => x.ProductId == productId);

            if(basketItem != null)
            {
                basketItem.Quantity++;
            }
            else
            {
                var product = db.Products.Find(productId);
                

                if(product!= null)
                {
                    var newBasketItems = new OrderItems
                    {
                        Product = product,
                        ProductId = productId,
                        Quantity = 1,
                        Price = product.Price
                    };

                    basket.Add(newBasketItems);
                }
            }

            session.Set<List<OrderItems>>(sessionKey, basket);
        }

        public int DeleteFromBasket(int productId)
        {
            var basket = GetBasket();
            
            var basketItem = basket.Find(x => x.ProductId == productId);

            if(basketItem != null)
            {
                basketItem.Quantity--;
                return basketItem.Quantity;
            }
            else
            {
                basket.Remove(basketItem);
            }

            return 0;

        }


        public decimal GetTotalValue()
        {
            var basket = GetBasket();
            return basket.Sum(x => (x.Product.Price * x.Quantity));
        }

        public int GetAmountBasketItems()
        {
            var basket = GetBasket();
            return basket.Sum(x => x.Quantity);
        }


        public Order CreateOrder(Order newOrder, string UserId)
        {
            var basket = GetBasket();
            var user = db.Users.SingleOrDefault(x => x.Id == UserId);
            newOrder.DateOfAddition = DateTime.UtcNow;
            newOrder.UserId = UserId;

            db.Orders.Add(newOrder);


            if (newOrder.OrderItems == null)
                newOrder.OrderItems = new List<OrderItems>();

            decimal basketValue = 0;
            foreach (var item in basket)
            {
                var newOrderItems = new OrderItems()
                {
                    ProductId = item.ProductId,
                    Product = item.Product,
                    Quantity = item.Quantity,
                    Price = item.Price,
                    
                };
                basketValue += (item.Price * item.Quantity);
                newOrder.OrderItems.Add(newOrderItems);
            }

            newOrder.TotalValue = basketValue;

            db.SaveChanges();

            return newOrder;
        }

        public void EmptyBasket()
        {
            
            session.Abandom();
        }
    }

}

Z góry dziekuje za pomoc :)

0

Sprawdzałeś debugerem?
o ile się nie mylę zabrakło ci zaktualizowania bazy danych

przesuń db.Orders.Add(newOrder); przed zaktualizowaniem bazby danych. Gdy już będziesz miał gotowy cały obiekt newOrder

0
Phoryn napisał(a):

Sprawdzałeś debugerem?
o ile się nie mylę zabrakło ci zaktualizowania bazy danych

przesuń db.Orders.Add(newOrder); przed zaktualizowaniem bazby danych. Gdy już będziesz miał gotowy cały obiekt newOrder

Kurcze nie pomogło

using Sklep.Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Web;

namespace Sklep.Infrastructure
{
    public class OrderManager
    {
        private ISessionManager session;
        private ApplicationDbContext db = new ApplicationDbContext();

        public OrderManager(ISessionManager session)
        {
            this.session = session;
           
            
        }

        public const string sessionKey = "BasketKey";


        public List<OrderItems> GetBasket()
        {
            List<OrderItems> basket;

            if(session.Get<List<OrderItems>>(sessionKey)==null)
            {
                basket = new List<OrderItems>();
            }
            else
            {
                basket = session.Get<List<OrderItems>>(sessionKey) as List<OrderItems>;
            }
            return basket;
        }

        public void AddToBasket(int productId)
        {
            var basket = GetBasket();
            var basketItem = basket.Find(x => x.ProductId == productId);

            if(basketItem != null)
            {
                basketItem.Quantity++;
            }
            else
            {
                var product = db.Products.Find(productId);
                

                if(product!= null)
                {
                    var newBasketItems = new OrderItems
                    {
                        Product = product,
                        ProductId = productId,
                        Quantity = 1,
                        Price = product.Price
                    };

                    basket.Add(newBasketItems);
                }
            }

            session.Set<List<OrderItems>>(sessionKey, basket);
        }

        public int DeleteFromBasket(int productId)
        {
            var basket = GetBasket();
            
            var basketItem = basket.Find(x => x.ProductId == productId);

            if(basketItem != null)
            {
                basketItem.Quantity--;
                return basketItem.Quantity;
            }
            else
            {
                basket.Remove(basketItem);
            }

            return 0;

        }


        public decimal GetTotalValue()
        {
            var basket = GetBasket();
            return basket.Sum(x => (x.Product.Price * x.Quantity));
        }

        public int GetAmountBasketItems()
        {
            var basket = GetBasket();
            return basket.Sum(x => x.Quantity);
        }


        public Order CreateOrder(Order newOrder, string UserId)
        {
            var basket = GetBasket();
            
            newOrder.DateOfAddition = DateTime.UtcNow;
            newOrder.UserId = UserId;

            


            if (newOrder.OrderItems == null)
                newOrder.OrderItems = new List<OrderItems>();

            decimal basketValue = 0;
            foreach (var item in basket)
            {
                var newOrderItems = new OrderItems()
                {
                    ProductId = item.ProductId,
                    Product = item.Product,
                    Quantity = item.Quantity,
                    Price = item.Price,
                    
                };
                basketValue += (item.Price * item.Quantity);
                newOrder.OrderItems.Add(newOrderItems);
            }

            newOrder.TotalValue = basketValue;
            db.Orders.Add(newOrder);
            db.SaveChanges();

            return newOrder;
        }

        public void EmptyBasket()
        {
            
            session.Abandom();
        }
    }

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1