Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';实体框架核心事务中的多个SaveChanges的意义是什么?_C#_.net Core_Transactions_Entity Framework Core - Fatal编程技术网

C# 什么';实体框架核心事务中的多个SaveChanges的意义是什么?

C# 什么';实体框架核心事务中的多个SaveChanges的意义是什么?,c#,.net-core,transactions,entity-framework-core,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.BeginTr

我正在为我的.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();
        }
    }
} 
public异步任务addDepositoHouse(int householdId,DepositorRequestModel模型)
{
使用(var transaction=await Context.Database.BeginTransactionAsync(IsolationLevel.Snapshot))
{
尝试
{
//将存款添加到数据库中
var存款=this.Mapper.Map(模型);
等待这个.Context.deposts.AddAsync(存款);
等待这个.Context.saveChangesSync();
//用押金还债
var debertstopay=等待this.Context.debnts
.Where(d=>d.HouseholdId==HouseholdId&&!d.IsPaid)
.OrderBy(d=>d.datemake)
.ToListAsync();
debustopay.ForEach(d=>d.IsPaid=true);
等待这个.Context.saveChangesSync();
//增加家庭的平衡
var Households=this.Context.Households
.FirstOrDefaultAsync(h=>h.Id==householdId);
住户.余额+=模型.存款金额;
等待这个.Context.saveChangesSync();
Commit();
返回这个;
}
抓住
{
transaction.Rollback();
返回此.BadRequest();
}
}
} 

如您所见,有3个数据库操作需要在事务中执行。储蓄存款,更新债务,更新家庭余额。现在,我可以选择在每次操作后放置
SaveChanges
,就像上面代码中显示的那样,或者完全放弃对
SaveChanges
的前两个调用,并且该方法的行为不会以任何方式改变。我在网上找到的大多数示例都包含多个SaveChanges调用,我想这两种方法之间一定有一些区别。然而,我找不到任何关于这种差异到底是什么的信息。有人能解释一下这个问题吗?

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

问得好。令人遗憾的是,像这样有趣而新颖的问题往往会获得接近票数的选票(这是违反规则的——这个问题很有效)。是的,这是有道理的。我以为引擎盖下还会发生更多的事情,但也许这就是全部。自动重新尝试事务怎么样?在这种情况下,对
SaveChanges
的调用是否可以被视为检查点,在重新尝试的情况下,代码的执行将继续,或者执行将再次从头开始?了解这一点很重要,SaveChanges调用仅在事务作用域内相关,在成功调用Commit之前不会持久化。因此,如果您想重试事务,这意味着第一个事务失败,所有脏的写入数据都被回滚,因此没有继续的必要