使用实体框架中的事务回滚添加/删除DbContext的DBSets

问题描述 投票:1回答:1

在使用Entity Framework 6的项目中,我的一般模式是

  1. 创建新实体以进行添加
  2. 将实体添加到DBSet的相关DbContext
  3. 设置这些对象的属性
  4. 打电话给DbContext.SaveChanges()

这是我的意思的一些伪代码:

    // Psuedo code to illustrate process. 
    void AddProcess()
    {

        var modelsToAdd = GetModelsToAdd();

        try
        {
            _context.Models.AddRange(modelsToAdd);

            _context.SaveChanges();

            // If we get here all is good.
        }
        catch (Exception ex)
        {
            _context.RemoveRange(modelsToAdd);
            throw;
        }
        finally
        {
            //....
        }
    }

我知道SaveChanges()方法在内部创建了自己的Transaction,因此如果在保存期间存在异常,则会回滚。但是,如果在DbSet期间发生错误,我想要的是将(2)中添加的实体从SaveChanges()中删除。基本上,好像从未发生过“添加”过程。

如您所见,目前我正在缓存所涉及模型的列表,然后在发生异常时将其删除。

我想知道的是,有更好的方法可以使用Transactions自动为我工作吗?那么,Transaction的内部SaveChanges()回滚能否回滚到DbSet的任何附加物?或者可以使用其他交易吗?

实现我想要的最佳/首选方式是什么?我对EF很新,所以这可能是显而易见的。

c# entity-framework entity-framework-6 dbcontext
1个回答
0
投票

https://code.msdn.microsoft.com/How-to-undo-the-changes-in-00aed3c4中的选项#1通常足以满足您希望在不删除和重新实例化Context的情况下回滚DbContext中的更改的大多数实现。通常,请求将失败并且调用将结束,因此DbContext范围应该结束,直到在新请求中尝试重试为止。

如果有一个非常好的理由可以立即重试/替换操作,我只会考虑回滚DbContext。想要在SaveChanges失败的情况下回滚DbSets通常是指示DbContext保持活动的时间太长。

在失败的情况下需要保存的日志记录等重要事项应该使用专用的DbContext,以便应用程序的DbContext上的失败的SaveChanges不会阻碍它们的更新。

© www.soinside.com 2019 - 2024. All rights reserved.