C# 什么';实体框架核心事务中的多个SaveChanges的意义是什么?
我正在为我的.net核心应用程序使用EF,我想知道在事务期间多次调用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
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之前不会持久化。因此,如果您想重试事务,这意味着第一个事务失败,所有脏的写入数据都被回滚,因此没有继续的必要