IEntityChangeTracker的多个实例不能引用实体对象。与EF6

时间:2013-11-12 21:47:16

标签: c# asp.net-4.0

这些是我的课程

public class Bill
    {
        [Key]
        public int BillID { get; set; }

        [Required]
        public int BillNumber { get; set; }

        [Required]
        public DateTime Date { get; set; }

        [Required]
        public string UserName { get; set; }

        [Required]
        public string Name { get; set; }

        [Required]
        public string Adress { get; set; }

        [Required]
        public string PostalCode { get; set; }

        [Required]
        public string City { get; set; }

        [Required]
        public string Country { get; set; }

        public Bill()
        {
            Date = new DateTime();
            Date = DateTime.Now;
        }



public class Cart
    {
        [Key]
        public int CartID { get; set; }

        [Required]
        public int BillID { get; set; }

        [Required]
        [ForeignKey("BillID")]
        public virtual Bill Bill { get; set; }

        public virtual ICollection<CartItems> Products {get; set;}
    }

public class CartItems
    {
        [Key]
        public int CartItemID { get; set; }

        [Required]
        public Product Product { get; set; }

        [Required]
        public int Qunatity { get; set; }
    }
}

我正在使用ASP.NET 4 Web应用程序。我有一个问题,当我想将产品添加到购物车时,它会抛出错误

IEntityChangeTracker的多个实例无法引用实体对象。

当我想在上下文中将Cart obejct添加到Carts时。

Bill bill = new Bill();
            bill.BillNumber = Bill.GetLastBillNumber(context) + 1;
            bill.Adress = txtAdress.Text;
            bill.City = txtCity.Text;
            bill.Country = ddlCountry.SelectedItem.Value.ToString();
            bill.Name = txtName.Text;
            bill.PostalCode = txtPostalCode.Text;
            bill.UserName = lblUserName.Text;

            context.Bills.Add(bill);
            context.SaveChanges();

            Cart cart = new Cart();
            cart.Bill = bill;
            cart.BillID = bill.BillID;
            cart.Products = Application["CartProducts"] as List<CartItems>;

            context.Carts.Add(cart);
            context.SaveChanges();

我读到了这个问题,但我不能分离它不适合我;

DataContext被定义为类

中的privet
private DataContext context = new DataContext();

如果有人可以帮助我。

THX。

1 个答案:

答案 0 :(得分:0)

您是否在其他地方的Application[CartProducts]其他地方加载了产品?那就是问题所在。

DataContext是一个工作单元实现,这意味着您在一次操作中完成的所有工作都必须在同一个上下文中完成。

虽然缓存产品通常是一个好主意,但它不起作用。您将不得不在列表中创建对象的副本。

cart.Products = (Application["CartProducts"] as List<CartItems>).Select(ci =>
                 CartItem { ProductId = ci.ProductId, Quantity = ci.Quantity }).ToList();

请注意,我已将Product替换为ProductId,以避免在对象树中再增加一个级别。在数据库中,对象之间的引用将作为外键实现,并通过映射到ProductId,您将能够访问它并直接使用它。有关映射外键的详细信息,请参阅this blogpost of mine