0

我有一个类似的问题。

我想在同一个事务范围内进行两次插入。这些对象是相关的,并且它们之间具有 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 关系并运行完全相同的代码,它运行良好,并且两个对象都设置了正确的属性。那么为什么这种方法会失败呢?而这应该怎么做呢?同样,我不想通过它们的导航属性附加实体。

谢谢!

4

2 回答 2

0

我会将 FK 关系留在数据库中,但从 SSDL 中删除 AssociationSet 和 Association。设计器不会让您这样做,您必须手动编辑 XML。

我正在使用 EF 4 顺便说一句。

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

于 2010-10-01T21:21:36.240 回答
0

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

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

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

当您尝试使用 FK 为 0 保存订单详细信息时,您会收到错误消息。

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

于 2010-10-01T21:52:20.200 回答