#database #.net-core #entity-framework-core
#База данных #.net-core #entity-framework-core
Вопрос:
Информация
Я использую ядро ef вместе с .net core 3.1 (подход с использованием кода), и я впервые использую эту платформу.
Сценарий
Я хочу зафиксировать некоторые изменения, которые я внес в свои объекты, в базе данных (простые операции добавления / удаления / обновления). Я использую SaveChanges или метод SaveChangesAsync (я не выполняю никаких транзакций вручную). Допустим, что-то пошло не так, и я получаю исключение.
Вопрос
Насколько я могу понять, в базу данных не было внесено никаких изменений, но как насчет контекста? Допустим, я хочу выполнить какую-то другую операцию в блоке try .. catch для этих объектов (например, попытаться сохранить хотя бы часть внесенных изменений).
- Сохраняются ли изменения в контексте после того, как исключение было вызвано методом SaveChanges?
- Когда обновляется контекст (для каждой транзакции, для каждого запроса от пользователя)?
Ответ №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
}
}
}
- Entity Framework имеет разные состояния обработки объектов. Добавление объекта в контекст не вносит никаких изменений в вашу базу данных. Вы сможете увидеть текущие изменения в контексте.ChangeTracker.
Все изменения будут выпущены после транзакции (SaveChanges или SaveChangeAsync).