Какой смысл нескольких SaveChanges в транзакции ядра сущности-каркас? - PullRequest
1 голос
/ 07 апреля 2019

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

1 Ответ

2 голосов
/ 07 апреля 2019

Иногда целесообразно вызвать SaveChanges, потому что вы можете получить грязный записанный идентификатор вставленной записи. В таких ситуациях, как вы упомянули, его можно использовать для разделения операций базы данных на более мелкие части, поэтому, если первая небольшая операция завершится неудачно, вы сохраните оставшуюся часть кода от выполнения, что означает меньшее количество операций для отката.

...