具有两个datacontexts的TransactionScope不会回滚

时间:2013-07-12 03:19:39

标签: entity-framework transactionscope

我试图通过回滚我们的datacontexts解决问题。 我们使用一个TransactionScope,并在两个不同数据库的两个数据上下文中。

最后我们要保存两个数据库的更改,以便调用.SaveChanges,但问题是当其他数据库发生错误时,第一个数据库上的更改仍然保存。

第一个数据库没有回滚,我做错了什么?

谢谢,

的Jakub

     public void DoWork()
        {
            using (var scope = new TransactionScope())
            {
                using (var rawData = new IntranetRawDataDevEntities())
                {
                    rawData.Configuration.AutoDetectChangesEnabled = true;

                    using (var dataWareHouse = new IntranetDataWareHouseDevEntities())
                    {
                        dataWareHouse.Configuration.AutoDetectChangesEnabled = true;

...对数据进行一些操作 - 没有调用savechanges()。

                        // Save changes for all items.
                        if (!errors)
                        {
// First database save.
                            rawData.SaveChanges();

// Fake data to fail the second database save.
                            dataWareHouse.Tasks.Add(new PLKPIDashboards.DataWareHouse.Task()
                                {
                                    Description = string.Empty,
                                    Id = 0,
                                    OperationsQueue = new OperationsQueue(),
                                    Queue_key = 79,
                                    TaskTypeSLAs = new Collection<TaskTypeSLA>(),
                                    Tasktype = null
                                });

// Second database save.
                            dataWareHouse.SaveChanges();

                            scope.Complete();
                        }
                        else
                        {
                            scope.Dispose();
                        }
                    }
                }
            }

1 个答案:

答案 0 :(得分:0)

从这篇文章http://blogs.msdn.com/b/alexj/archive/2009/01/11/savechanges-false.aspx

尝试使用

rawData.SaveChanges(false);

dataWareHouse.SaveChanges(false);

//if everything is ok

scope.Complete();
rawData.AcceptAllChanges();
dataWareHouse.AcceptAllChanges();