尝试保存全新的对象树时出现以下问题。
我创建了一个包含许多子对象的对象。子对象与创建的初始对象相距1级。我的问题是我尝试创建的子对象之一也有一个FK到其他子对象之一。所以在最初创建这些对象时,FK当然是0,因为尚未创建的子对象的PK当前为0.当我在上下文中调用SaveChanges时它会出错,因为该键在子对象上是不确定的这依赖于另一个子对象的存在。这是一个非常大的对象树,因此我似乎需要首先保存父对象然后按顺序保存其他对象,以便我可以获取新的PK值以用于那些依赖于其他对象的表。问题是我想要一个全有或全无的情况,所以我想要所有对象保存或没有。 EF 6中的SaveChanges删除了将false作为参数传递的能力,然后调用SaveAllChanges()。对我来说,最好的办法是什么才能让它发挥作用?
答案 0 :(得分:1)
您应该使用交易。在事务中,您应首先将父对象添加到dbset并使用Context.SaveChanges()
在您提交事务之前,不会在db上创建实体。但是它会保留id(主键)。所以你可以在子对象上使用这个id。如果你需要id(主键)使用Context.SaveChanges()
。
using (var myTransaction = Context.Database.BeginTransaction())
{
try
{
//Crate Parent Object
Context.SaveChanges();
//Create Child Object;
Context.SaveChanges();
//Other Childs
Context.SaveChanges();
//If everything goes well
myTransaction.Commit();
}
catch (Exception)
{
myTransaction.Rollback();
}
}