我有这个架构:
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,而不进一步向下对象图。怎么能实现呢?
非常感谢任何帮助,谢谢。
答案 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调用之前?