Общий шаблон для меня в проекте, использующем Entity Framework 6:
- Создание новых сущностей для добавления
- Добавление сущностей в соответствующие
DBSet
из DbContext
- Установить свойства этих объектов
- Вызов
DbContext.SaveChanges()
Вот некоторый псевдокод для того, что я имею в виду:
// Psuedo code to illustrate process.
void AddProcess()
{
var modelsToAdd = GetModelsToAdd();
try
{
_context.Models.AddRange(modelsToAdd);
_context.SaveChanges();
// If we get here all is good.
}
catch (Exception ex)
{
_context.RemoveRange(modelsToAdd);
throw;
}
finally
{
//....
}
}
Мне известно, что метод SaveChanges()
внутренне создает свой собственный Transaction
, поэтому при возникновении исключения во время сохранения он будет откатан.Однако я хочу, чтобы добавленные сущности в (2) были удалены из DbSet
, если во время SaveChanges()
произойдет ошибка.По сути, как будто процесс «Добавить» никогда не происходил.
Как видите, в данный момент я кеширую список задействованных моделей, а затем удаляю их, если происходит исключение.
То, что я хотел бы знать, есть ли лучший способсделать это с Транзакциями, автоматически выполняющими работу за меня?Итак, может ли внутренний Transaction
откат SaveChanges()
также откатить какие-либо дополнения к DbSet
?Или можно использовать другие транзакции?
Каков наилучший / предпочтительный способ достижения того, что я ищу?Я довольно новичок в EF, так что это может быть чем-то очевидным.