如何:避免插入相关实体?

时间:2011-01-02 12:05:17

标签: c# entity-framework-4

我有这个架构:

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

我想将OrderItems的Order插入到数据库中,所以我写了这个方法:

    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 个答案:

答案 0 :(得分:3)

在订单上调用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 :(得分:1)

我几乎没有EF体验,但看起来您的问题可能是您的产品被保存到新的上下文中。如果你添加这个会有所帮助:

repository.Attach(orderItem.Product);

在AddObject调用之前?