我有类似的问题。
我想在同一个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。
谢谢!
答案 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为您完成工作,或重新加载订单。