Изменяется ли исключение savechanges() в откате ядра ef в контексте?

#database #.net-core #entity-framework-core

#База данных #.net-core #entity-framework-core

Вопрос:

Информация

Я использую ядро ef вместе с .net core 3.1 (подход с использованием кода), и я впервые использую эту платформу.

Сценарий

Я хочу зафиксировать некоторые изменения, которые я внес в свои объекты, в базе данных (простые операции добавления / удаления / обновления). Я использую SaveChanges или метод SaveChangesAsync (я не выполняю никаких транзакций вручную). Допустим, что-то пошло не так, и я получаю исключение.

Вопрос

Насколько я могу понять, в базу данных не было внесено никаких изменений, но как насчет контекста? Допустим, я хочу выполнить какую-то другую операцию в блоке try .. catch для этих объектов (например, попытаться сохранить хотя бы часть внесенных изменений).

  1. Сохраняются ли изменения в контексте после того, как исключение было вызвано методом SaveChanges?
  2. Когда обновляется контекст (для каждой транзакции, для каждого запроса от пользователя)?

Ответ №1:

  1. Да, ваши изменения сохранены и могут быть обработаны путем отслеживания исключения DbUpdateException или DbUpdateConcurrencyException в качестве примера.

Например:

             try
            {
                // Commit your operation
            }
            catch (DbUpdateException ex) when (ex.InnerException is SqlException sqlEx)
            {
                if (ex.Entries.Any())
                {
                    // entity framework knows about failed entities
                    foreach (var e in ex.Entries)
                    {
                       // Make necessary actions
                    }
                }
            }
  
  1. Entity Framework имеет разные состояния обработки объектов. Добавление объекта в контекст не вносит никаких изменений в вашу базу данных. Вы сможете увидеть текущие изменения в контексте.ChangeTracker.
    Все изменения будут выпущены после транзакции (SaveChanges или SaveChangeAsync).