EF 6 SaveChanges with Transaction

时间:2015-12-11 12:20:24

标签: c# entity-framework

尝试保存全新的对象树时出现以下问题。

我创建了一个包含许多子对象的对象。子对象与创建的初始对象相距1级。我的问题是我尝试创建的子对象之一也有一个FK到其他子对象之一。所以在最初创建这些对象时,FK当然是0,因为尚未创建的子对象的PK当前为0.当我在上下文中调用SaveChanges时它会出错,因为该键在子对象上是不确定的这依赖于另一个子对象的存在。这是一个非常大的对象树,因此我似乎需要首先保存父对象然后按顺序保存其他对象,以便我可以获取新的PK值以用于那些依赖于其他对象的表。问题是我想要一个全有或全无的情况,所以我想要所有对象保存或没有。 EF 6中的SaveChanges删除了将false作为参数传递的能力,然后调用SaveAllChanges()。对我来说,最好的办法是什么才能让它发挥作用?

1 个答案:

答案 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();
                    }
                }