C# ASP.NET MVC5,一个实体对象不能被多个IEntityChangeTracker实例引用

C# ASP.NET MVC5,一个实体对象不能被多个IEntityChangeTracker实例引用,c#,entity-framework,asp.net-mvc-5,C#,Entity Framework,Asp.net Mvc 5,当我尝试向db添加对象时,出现如下错误: EntityFramework.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理 其他信息:一个实体对象不能被多个IEntityChangeTracker实例引用 这是我的密码: Order.cs namespace OnlineMealOrdering.Models { public class Order { [Key] public in

当我尝试向db添加对象时,出现如下错误:

EntityFramework.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理 其他信息:一个实体对象不能被多个IEntityChangeTracker实例引用

这是我的密码:

Order.cs

namespace OnlineMealOrdering.Models
{
    public class Order
    {
        [Key]
        public int Id { get; set; }
        public virtual User User { get; set; }
        public virtual Restaurant Restaurant { get; set; }
        public int TotalPrice { get; set; }
        public DateTime OrderTime { get; set; }
        public string Address { get; set; }
        public string UserTEL { get; set; }
        public string RestaurantTEL { get; set; }
        public string Memo { get; set; }
        public virtual ICollection<OrderDetail> OrderDetails { get; set; }
    }
}
Cart.cs

public class Cart
{
    public Dish Dish { get; set; }
    public int Count { get; set; }
}
控制器

public class OrderController : Controller
    {
        private OnlineMealOrderingContext db = new OnlineMealOrderingContext();

        List<Cart> Carts
        {
            get
            {
                if (Session["Carts"] == null)
                {
                    Session["Carts"] = new List<Cart>();
                }
                return (Session["Carts"] as List<Cart>);
            }
            set { Session["Carts"] = value; }
        }

 [HttpPost]
            public ActionResult Submit(string memo)
            {
                int user_id = (Session["Account"] as Account).Id;
                var user = (from p in db.Users
                            where p.Id == user_id
                            select p).FirstOrDefault();
                var restaurant = this.Carts.FirstOrDefault().Dish.Restaurant;
                int total_price = 0;
                foreach (var item in this.Carts)
                {
                    total_price += item.Dish.Price * item.Count;
                }
                Order order = new Order
                {
                    User = user,
                    Restaurant = restaurant,
                    TotalPrice = total_price,
                    OrderTime = DateTime.Now,
                    Address = user.Address,
                    UserTEL = user.TEL,
                    RestaurantTEL = restaurant.TEL,
                    Memo = memo,
                    OrderDetails = new List<OrderDetail>()
                };

                foreach (var item in this.Carts)
                {
                    order.OrderDetails.Add(new OrderDetail() { Dish = item.Dish, Price = item.Dish.Price, Count = item.Count });
                }
}


它发生在红色区域语句中。

很难说,因为您没有包括所有的实体,但由于您的“Dish”对象来自会话中存储的列表,我猜Dish也从数据库中提取。如果是这样,它可能属于DbContext的另一个实例,所以当您尝试将其添加到订单时,它会抱怨,因为您的前一个实例已经在跟踪该盘


顺便说一句,这就是为什么在会话中存储从DbContext获得的内容是个坏主意。。另外,它会保留引用并导致内存泄漏。

这到底是什么。Carts?@ErikFunkenbusch,我已经在更新这个问题了。嗯,什么是最方便的修改方法。@DrakFlameMaster-我不知道你的应用程序的其余部分是如何工作的。。所以我不可能说。你应该从数据库中检索数据。我已经解决了这个问题,你是对的。这是会话的问题。
public class OrderController : Controller
    {
        private OnlineMealOrderingContext db = new OnlineMealOrderingContext();

        List<Cart> Carts
        {
            get
            {
                if (Session["Carts"] == null)
                {
                    Session["Carts"] = new List<Cart>();
                }
                return (Session["Carts"] as List<Cart>);
            }
            set { Session["Carts"] = value; }
        }

 [HttpPost]
            public ActionResult Submit(string memo)
            {
                int user_id = (Session["Account"] as Account).Id;
                var user = (from p in db.Users
                            where p.Id == user_id
                            select p).FirstOrDefault();
                var restaurant = this.Carts.FirstOrDefault().Dish.Restaurant;
                int total_price = 0;
                foreach (var item in this.Carts)
                {
                    total_price += item.Dish.Price * item.Count;
                }
                Order order = new Order
                {
                    User = user,
                    Restaurant = restaurant,
                    TotalPrice = total_price,
                    OrderTime = DateTime.Now,
                    Address = user.Address,
                    UserTEL = user.TEL,
                    RestaurantTEL = restaurant.TEL,
                    Memo = memo,
                    OrderDetails = new List<OrderDetail>()
                };

                foreach (var item in this.Carts)
                {
                    order.OrderDetails.Add(new OrderDetail() { Dish = item.Dish, Price = item.Dish.Price, Count = item.Count });
                }
                db.SaveChanges();

                this.Carts.Clear();
                return RedirectToAction("Index", "Home");
            }