在实体框架中调用多个SaveChanges

Adm*_*vić 25 transactions transactionscope entity-framework-4

我正在构建我自己的自定义存储库,基于实体框架,我正在创建一些扩展方法,允许我将部分视图模型保存为实体模型,因此我正在构建自己的添加和更新方法.

目前,每个方法都有来自DbContext的SaveChanges(),在末尾调用,这意味着每个模型都会调用一个调用.

我正在为MVC4站点构建这个基本DAL模式,这意味着大多数时候我将访问1个模型,但事实并非必须如此.

在更新即3个实体时为每个模型调用SaveChanges()是不是太糟糕的做法,还是应该先将所有内容添加到对象上下文中,而不是将SaveChanges()作为某种事务提交?

Wah*_*tar 72

我知道这是一个迟到的答案,但我发现分享很有用.

现在,在EF6它更容易使用到acheeve此dbContext.Database.BeginTransaction()

像这样 :

using (var context = new BloggingContext())
{
    using (var dbContextTransaction = context.Database.BeginTransaction())
    {
        try
        {
            // do your changes
            context.SaveChanges();

            // do another changes
            context.SaveChanges();

            dbContextTransaction.Commit();
        }
        catch (Exception ex)
        {
            //Log, handle or absorbe I don't care ^_^
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看此内容

再次它在EF6 Onwards

  • 无需调用Rollback它会在发生异常时自动调用 (19认同)
  • ...因为`using`会在它离开范围时处理该事务,如果尚未成功调用`Commit`,它将回滚它. (11认同)
  • 如果您的逻辑不需要,我建议避免这种模式。在事务之间执行步骤将导致服务器不必要地持有对象的锁。每个工作单元仅调用一次“SaveChanges()”可以降低这种影响。 (2认同)

Era*_*nga 6

SaveChanges当相关实体应该在单个事务中持久化时,多次调用(没有事务范围)是一种不好的做法.你创建的是漏洞抽象.创建一个单独的工作单元类或使用它ObjectContext/DbContext自己.

  • 或者......使用TransactionScope. (3认同)
  • 有时,在使用旧数据库时,您没有其他选项可以多次调用“SaveChanges”。例如,您的数据库有一个存储过程或触发器,可以生成格式非常特殊的标识符,并且您需要在工作单元中间获取该标识符,以便可以将该标识符分配给其他一些实体。因此,您需要首先调用“SaveChanges”将更改保存到数据库并获取该标识符,然后再次保存最终实体。 (3认同)