2015-05-21 2 views
1

Когда я пытаюсь добавить объект в БД, это появляется ошибка, как следует:ASP.NET MVC5, Объект объект не может ссылаться несколько экземпляров IEntityChangeTracker

Исключение из «System.InvalidOperationException» типа произошел в EntityFramework.dll, но не был обработан в коде пользователя Дополнительная информация: Объект сущности не может ссылаться на несколько экземпляров 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; } 
    } 
} 

OrderDetail.cs

namespace OnlineMealOrdering.Models 
{ 
    public class OrderDetail 
    { 
     [Key] 
     public int Id { get; set; } 
     public virtual Order Order { get; set; } 
     public Dish Dish { get; set; } 
     public int Price { get; set; } 
     public int Count { 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 }); 
       } 

db.Orders.Add (заказ);

   db.SaveChanges(); 

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

}

Это произошло в красном заявлении области.

+0

Что это такое? Карточки? –

+0

@ ErikFunkenbusch, я уже обновляю вопрос. –

ответ

0

Трудно сказать, поскольку вы не включили все свои сущности, но поскольку ваш объект «Блюдо» происходит из списка, хранящегося в сеансе, я предполагаю, что Блюдо было вытащено из базы данных. Если это так, он может принадлежать другому экземпляру DbContext, поэтому, когда вы пытаетесь добавить его в свои Заказы, он жалуется, потому что Dish уже отслеживается вашим предыдущим экземпляром.

Кстати, вот почему хранение вещей, которые вы получаете из своего DbContext в сеансе, является плохой идеей .. плюс он может поддерживать ссылки и приводить к утечкам памяти.

+0

Какой самый удобный способ модификации. –

+0

@DrakFlameMaster - я понятия не имею, как работает остальная часть вашего приложения ... поэтому я не могу сказать. Вероятно, вы должны просто извлечь данные из базы данных. –

+0

Я решил проблему, вы правы. Это проблема сеанса. –

Смежные вопросы