Как: избегать вставки связанных сущностей? - PullRequest
2 голосов
/ 02 января 2011

У меня есть эта схема:

http://img602.imageshack.us/img602/6978/schemac.png

Я хочу вставить Order с OrderItems в базу данных, поэтому я написал этот метод:

    public void SaveOrder(Order order)
    {
        using (var repository = new StoreEntities())
        {
            // Add order.
            repository.Orders.AddObject(order);

            // Add order items.
            foreach (OrderItem orderItem in order.OrderItems)
            {
                repository.OrderItems.AddObject(orderItem);
            }

            repository.SaveChanges();
        }
    }

Все вставлено просто отлично, за исключением того, что новые записи о товарах тоже вставлены , что не то, что я хочу.

Я хочу вставить Order и его OrderItems, не углубляясь в граф объектов. Как этого достичь?

Любая помощь очень ценится, спасибо.

Ответы [ 2 ]

3 голосов
/ 02 января 2011

При вызове AddObject для заказа все элементы в графе объектов помечаются как вставленные. Таким образом, вы должны пометить продукты как неизмененные:

public void SaveOrder(Order order)     
{         
  using (var repository = new StoreEntities())         
  {             
    // Add order - calling add object marks Order and all entities in its 
    // object graph as Added - they will be inserted to database             
    repository.Orders.AddObject(order);              

    // You don't need to add order items because they should be added together 
    // with order

    // But you don't want to insert Products again, do you?
    // So you have to say that Products are not Added but Unchanged             
    foreach (var orderItem in order.OrderItems)             
    {                 
      // Not sure how to do it with your repository but with ObjectContext 
      // you can do
      // context.ObjectStateManager.ChangeObjectState(orderItem.Product, 
      //   EntityState.Unchanged);  
    }     
  }
} 
1 голос
/ 02 января 2011

У меня практически нет опыта работы с EF, но похоже, что ваша проблема может заключаться в том, что ваши продукты сохраняются в новом контексте.Поможет ли это, если вы добавите это:

repository.Attach(orderItem.Product);

прямо перед вызовом AddObject?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...