C# ASP.NET MVC5,一个实体对象不能被多个IEntityChangeTracker实例引用
当我尝试向db添加对象时,出现如下错误: EntityFramework.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理 其他信息:一个实体对象不能被多个IEntityChangeTracker实例引用 这是我的密码: Order.csC# 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
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");
}