context.SaveChanges()
}
В оставшемся материале главы (и книги) вы обнаружите много примеров сохранения изменений.
Поддержка транзакций и точек сохранения
Исполняющая среда EF Core помещает каждый вызов SaveChanges()/SaveChangesAsync()
DbContext в явную транзакцию. Для выполнения явной транзакции создайте транзакцию с применением свойства Database класса, производного от DbContext. Управляйте своими операциями обычным образом и затем предпримите фиксацию или откат транзакции. Ниже приведен фрагмент кода, где все демонстрируется:using var trans = context.Database.BeginTransaction();
try
{
// Создать, изменить, удалить запись.
context.SaveChanges();
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
}
В версии EF Core 5 были введены точки сохранения для транзакций EF Core. Когда вызывается метод SaveChanges()/SaveChangesAsync()
CreateSavePoint() и RollbackToSavepoint() для транзакции:using var trans = context.Database.BeginTransaction();
try
{
// Создать, изменить, удалить запись.
trans.CreateSavepoint("check point 1");
context.SaveChanges();
trans.Commit();
}
catch (Exception ex)
{
trans. RollbackToSavepoint("check point 1");
}
Транзакции и стратегии выполнения
В случае активной стратегии выполнения (как при использовании EnableRetryOnFailure()
Execute(), чтобы создать явную транзакцию:var strategy = context.Database.CreateExecutionStrategy();
strategy.Execute(() =>
{
using var trans = context.Database.BeginTransaction();
try
{
actionToExecute();
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
}
});
События SavingChanges/SavedChanges
В версии EF Core 5 появились три новых события, которые инициируются методами SaveChanges()/SaveChangesAsync()
SavingChanges запускается при вызове SaveChanges(), но перед выполнением операторов SQL в хранилище данных, а событие SavedChanges — после завершения работы метода SaveChanges(). В следующем (простейшем) коде демонстрируются события и их обработчики в действии:public ApplicationDbContext(DbContextOptions
: base(options)
{
SavingChanges += (sender, args) =>
{
Console.WriteLine($"Saving changes for {((DbContext)sender).Database.
GetConnectionString()}");
};
SavedChanges += (sender, args) =>
{
Console.WriteLine($"Saved {args.EntitiesSavedCount} entities");
};
SaveChangesFailed += (sender, args) =>
{
Console.WriteLine($"An exception occurred! {args.Exception.Message}
entities");
};
}
Класс DbSet
Для каждой сущности в своей объектной модели вы добавляете свойство типа DbSet
DbSet представляет собой специализированную коллекцию, используемую для взаимодействия с поставщиком баз данных с целью получения, добавления, обновления и удаления записей в базе данных. Каждая коллекция DbSet предлагает несколько основных служб для взаимодействия с базой данных. Любые запросы LINQ, запускаемые в отношении класса DbSet, транслируются поставщиком базы данных в запросы к базе данных. В табл. 22.2 описан ряд основных членов класса DbSet.