实体框架核心事务中的多个SaveChanges有什么意义?

时间:2019-04-07 19:07:33

标签: c# .net-core transactions entity-framework-core

我在.net核心应用程序中使用了EF,我想知道在事务期间多次调用SaveChanges与在提交之前仅调用一次之间有什么区别。为了更好地说明我的问题,我将提供一些伪代码。

public async Task<IActionResult> AddDepositToHousehold(int householdId, DepositRequestModel model)
{
    using (var transaction = await Context.Database.BeginTransactionAsync(IsolationLevel.Snapshot))
    {
        try
        {
            // Add the deposit to the database
            var deposit = this.Mapper.Map<Deposit>(model);
            await this.Context.Deposits.AddAsync(deposit);

            await this.Context.SaveChangesAsync();

            // Pay some debts with the deposit
            var debtsToPay = await this.Context.Debts
                .Where(d => d.HouseholdId == householdId && !d.IsPaid)
                .OrderBy(d => d.DateMade)
                .ToListAsync();

            debtsToPay.ForEach(d => d.IsPaid = true);

            await this.Context.SaveChangesAsync();

            // Increase the balance of the household
            var household = this.Context.Households
                .FirstOrDefaultAsync(h => h.Id == householdId);

            household.Balance += model.DepositAmount;

            await this.Context.SaveChangesAsync();

            transaction.Commit();
            return this.Ok();
        }
        catch
        {
            transaction.Rollback();
            return this.BadRequest();
        }
    }
} 

如您所见,在事务中需要执行3个数据库操作。保存存款,更新债务和更新家庭余额。现在,我可以选择将SaveChanges放在每个操作之后,就像上面的代码所示,或者我可以完全放弃对SaveChanges的前两个调用,并且该方法的行为不会改变以任何方式。我在网上找到的大多数示例都包含对SaveChanges的多次调用,并且我猜这两种方法之间肯定会有一些区别。但是,我找不到任何信息,确切地说这是什么区别。有人可以请问一下这个问题吗?

1 个答案:

答案 0 :(得分:2)

有时,调用SaveChanges很实用,因为您可以检索插入记录的脏写入ID。在您提到的情况下,它可能被用于将数据库操作拆分为较小的部分,因此,当第一个小操作失败时,您将保存其余代码以免执行,这意味着较少的操作可回滚。