实体框架/ EF4:在事务管理器中多次插入相关实体

时间:2010-08-20 12:22:58

标签: entity-framework entity-framework-4 foreign-key-relationship savechanges updateexception

我有类似的问题。

我想在同一个transactioncope中进行两次插入。这些对象是相关的,它们之间有FK关系,但由于多种原因,我不希望通过导航属性连接它们,而只是通过ID连接它们。

这简化了我想要完成的任务:

Order o = new Order();
OrderDetails d = new OrderDetails();
new Repository().SaveNew(o, d);

class Repository{

void SaveNew(Order o, OrderDetails d){
  using (TransactionScope transaction = new TransactionScope())
  {
   _context.Connection.Open();

   // order
   _context.Orders.ApplyChanges(o);
   _context.SaveChanges();

    // details
    d.OrderID = o.ID;
    _context.OrderDetails.ApplyChanges(d);
    _context.SaveChanges(); <--- UpdateException

    _context.Connection.Close();
    transaction.Complete();
  }
 }
}

问题是我得到了一个UpdateException,因为FK评估失败了。我试图删除FK关系并运行完全相同的代码,它工作正常,并且两个对象都设置了正确的属性。那么为什么这种方法会失败呢?那应该怎么做呢?同样,我不想通过导航属性附加entites。

谢谢!

2 个答案:

答案 0 :(得分:0)

我会在数据库中保留FK关系,但是从SSDL中删除AssociationSet和Association。设计人员不允许您这样做,您必须手动编辑XML。

我正在使用EF 4 btw。

然后在SaveNew方法中使用AddObject和SaveChanges添加第一个(父)对象。在子项上设置外键属性,并使用AddObject和SaveChanges添加它。

答案 1 :(得分:0)

我没有运行开发环境来测试这个,但我认为正在发生的是:

假设在数据库中生成了id。在您保存订单时,您不知道ID。

然后,订单明细的订单ID被设置为订单的ID,但订单未从数据库重新加载。我怀疑该值为0.

当您尝试使用FK为0保存订单明细时,会出现错误。

同时保存两者,以便EF为您完成工作,或重新加载订单。