Я использую EF для своего приложения .net-core, и мне интересно, в чем разница между вызовом 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
после каждой операции, как показано в коде выше, или я могу полностью отбросить первые 2 вызова на SaveChanges
, и поведение метода не изменится никоим образом. Большинство примеров, которые я нашел в Интернете, содержат несколько вызовов SaveChanges, и я полагаю, что между этими двумя подходами должна быть некоторая разница. Тем не менее, я не могу найти никакой информации, в чем именно заключается эта разница. Может кто-нибудь пролить свет на эту проблему?