none
Entity Framework / добавление в базу связки данных один-ко-многим RRS feed

  • Вопрос

  • Здравствуйте! 

    Подскажите пожалуйста, как вставить в базу объект в  котором сущности связаны один-ко-многим. 

    Например у меня формируется заказ в нем описаны сущности Order(Заказы) и OrderItems(Продукты, которые были заказаны)

    Как реализовать добавление связки данных Order и OrderItems?

    public class Order
        {
            public int Id {get; set;}
            public DateTime OrderDate { get; set; }
            public Decimal TotalSum { get; set; }
            public bool? ImportTo_1c { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string Phone { get; set; }
            public string Email { get; set; }
            public string Comment { get; set; }
     
            public virtual List<OrderItem> OrderItems { get; set; }
     
            public int ShippingTypeId { get; set; }
            public virtual ShippingType ShippingType { get; set; }
     
            public int? AddressId { get; set; }
            public virtual Address Address { get; set; }
     
            public int PaymentTypeId { get; set; }
            public virtual PaymentType PaymentType { get; set; }
     
            public int? PaymentId { get; set; }
            public virtual Payment Payment { get; set; }
        }


      public class OrderItem
        {
            [Key]
            public int Id { get; set; }
            public int Quantity { get; set; }
            public decimal Price { get; set; }
            public virtual Order Order { get; set; }
            public virtual Product Product { get; set; }
        }

    Ниже cart.Lines Это продукты в корзине, находящиеся в сессии

    order.OrderItems = new List<OrderItem>();
                    foreach (var item in cart.Lines)
                    {
                        order.OrderItems.Add(new OrderItem
                        {
                            Product = item.Product,
                            Quantity = item.Quantity
                        });
                    }
                    order.OrderDate = DateTime.Now;
                    OrderDB.Create(order);
                    OrderDB.Save();
                    cart.Clear();

    Код ниже выдает ошибку На объект сущности не могут ссылаться несколько экземпляров интерфейса IEntityChangeTracker.

    public void Create(Order Order)
            {
                db.Orders.Add(Order);
            }


    Приму к сведению любые догадки!!

    SOS!!

    P.S. Если OrderItems равен null, т.е. добавляю Order без связи один-ко-многим, то все работает. Т.е. всё связки один-к-одному добавляются.

    18 сентября 2014 г. 8:22

Ответы

Все ответы

  • В классе Order для ключа Id над ней вещайте ключ [Key]

    Для связки нужно в OrderItems добавить поле OrderId и над ней [ForeignKey("Order")]

    Остальное все можно оставить как есть.


    Mak Arti


    18 сентября 2014 г. 9:29
  • Спасибо за совет!!  

    в Order ключ прописан в метаданных.

    По вашей наводке добавил 

            [Key]
            public int Id { get; set; }
            public int Quantity { get; set; }
            public decimal Price { get; set; }
            [ForeignKey("Order")]
            public int OrderId { get; set; }
            public virtual Order Order { get; set; }
            [ForeignKey("Product")]
            public int ProductId { get; set; }
            public virtual Product Product { get; set; }

    и изменил в контроллере

                        order.OrderItems.Add(new OrderItem
                        {
                            ProductId = item.Product.Id,
                            Quantity = item.Quantity,
                            Price = item.Product.Price,
                            OrderId = order.Id
                        });

    И всё заработало! Раньше прописывал 

                        order.OrderItems.Add(new OrderItem
                        {
                            Product = item.Product,
                            Quantity = item.Quantity,
                            Price = item.Product.Price,
                            Order = order
                        });
    И происходило зацикливание!

    P.S. Еще раз спасибо!

    18 сентября 2014 г. 10:13
  • А попробуйте без этого OrderId  = order.Id

    order.OrderItems.Add(new OrderItem { ProductId = item.ProductId, Quantity = item.Quantity, Price = item.Product.Price });

    Она и так должна работать. сама свяжется.


    Mak Arti



    18 сентября 2014 г. 10:25
  • Работает! 

    Я раньше не понимал зачем создавать дополнительное поле

      [ForeignKey("Order")]
            public int OrderId { get; set; }
            public virtual Order Order { get; set; }

    т.к.  EF отлично связывает при чтении и без этого поля. 

    При этом создается поле 

    Order_Id

    в базе данных.

    Теперь-то всё стало на свои места.

    Спасибо!

    18 сентября 2014 г. 11:15