【问题标题】:EF6 data is being updated after transaction rollback事务回滚后正在更新 EF6 数据
【发布时间】:2020-12-08 16:41:30
【问题描述】:

我创建了一个 Entity Framework 6 事务并更新了其中的一些数据,然后一些代码引发了异常。我捕捉到异常并回滚事务。但是,当我检查数据库时,我发现数据已经更新,即使我回滚了事务。

发生异常时如何防止数据被保存?

 public void MainMethod(){
        try {
           MethodA();
        }
        catch (Exception) {
             using (var tran = _context.Database.BeginTransaction())
            {
               try
               { 
                   var logObject = new LogObject();
                   logObject.text = "some text";
                  _context.LogObjects.Add(logObject);
                   _context.SaveChanges();
                  tran.Commit();//when an exception happens in MethodA, the method a data still saves, when this transaction gets committed here.
               }
               catch (Exception)
               {
                  tran.Rollback();
                  throw;
               }
           }
        }
    }

    public void MethodA()
    {
        using (var tran = _context.Database.BeginTransaction())
        {
            try
            {
                UpdateMyData();
                _context.SaveChanges();
                tran.Commit();
                tran.Dispose();
            }
            catch (Exception)
            {
                tran.Rollback();
                tran.Dispose();
                throw;
            }
        }
    }

    public void UpdateMyData()
    {
        try
        {
            var dataRecord = _context.MySampleDataRecords.Where(x => x.isActive).First();
            dataRecord.isActive = false;  //This update is being saved to the database and it should not be saved
        }
        catch (Exception ex)
        {
            throw new Exception("Test exception");
        }
    }

【问题讨论】:

  • 这能回答你的问题吗? Entity Framework 6 transaction rollback
  • @Roar 不幸的是它没有。根据该解释,我的代码中的 dataRecord.isActive = false 不应保存到数据库中,但由于某种原因它正在保存。
  • 您确定Db 和_context 指的是同一个DbContext 吗?无论如何,简单地尝试发布该问题的完整重现。您可能会自己发现问题,如果没有,请发布重现。
  • @DavidBrowne-Microsoft 是的,它们是相同的上下文,为了清楚起见,我什至更新了代码以使用相同的上下文。事实证明,我对 MethodA 的更改是在 MainMethod 中的事务上提交的。我曾尝试在 MethodA 上调用 Dispose,但问题仍然存在。
  • 我使用以下答案解决了我的问题。从上下文中分离我的实体:stackoverflow.com/a/33901817/618916

标签: c# entity-framework transactions entity-framework-6


【解决方案1】:

您需要使用相同的数据库上下文来启动事务范围和编辑数据上下文。您还必须在失败时回滚更改

       public void MethodA()
        {
            using (var tran = _context.Database.BeginTransaction())
            {
                try
                {
                    UpdateMyData();
                    Db.SaveChanges();
                    tran.Commit();
                }
                catch (Exception)
                {
                    tran.Rollback();
                    throw;
                }
            }
        }

        public void UpdateMyData()
        {
            try
            {
                var dataRecord = _context.MySampleDataRecords.Where(x => x.isActive).First();
                dataRecord.isActive = false;  //This update is being saved to the database and it should not be saved
            }
            catch (Exception ex)
            {
                _context.Rollback();
                throw new Exception("Test exception");
            }
        }

【讨论】:

  • 我不小心发布了对您答案的编辑。我正在尝试编辑自己的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 2022-09-27
  • 2012-09-19
相关资源
最近更新 更多