Язык программирования C#9 и платформа .NET5
Шрифт:
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
namespace AutoLot.Samples
{
public class ApplicationDbContextFactory : IDesignTimeDbContextFactory
<ApplicationDb
Context>
{
public ApplicationDbContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>;
var connectionString =
@"server=.,5433;Database=AutoLotSamples;
User Id=sa;Password=
P@ssw0rd;";
optionsBuilder.UseSqlServer(connectionString);
Console.WriteLine(connectionString);
return new ApplicationDbContext(optionsBuilder.Options);
}
}
}
Интерфейс
DbContext
, предназначенный для выполнения действий вроде создания и применения миграций базы данных. Поскольку фабрика является конструкцией этапа проектирования и не используется во время выполнения, строка подключения к базе данных разработки обычно будет жестко закодированной. В версии EF Core 5 появилась возможность передавать методу CreateDbContext
аргументы из командной строки, о чем пойдет речь позже в главе. Метод OnModelCreating
Базовый класс
DbContext
открывает доступ к методу OnModelCreating
, который применяется для придания формы сущностям, используя Fluent API. Детали подробно раскрываются далее в главе, а пока добавьте в класс ApplicationDbContext
следующий код:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Обращения к Fluent API.
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
Сохранение изменений
Чтобы заставить
DbContext
и ChangeTracker
сохранить любые изменения, внесенные в отслеживаемые сущности, вызовите метод SaveChanges
(или SaveChangesAsync
) на экземпляре класса, производного от DbContext
:
static void SampleSaveChanges
{
// Фабрика не предназначена для такого использования,
// но это демонстрационный код
var context = new ApplicationDbContextFactory.CreateDbContext(null);
// Внести какие-нибудь изменения.
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
, а транзакция уже выполняется, исполняющая среда EF Core создает в этой транзакции точку сохранения. Если вызов терпит неудачу, то откат транзакции происходит в точку сохранения, а не в начало транзакции. Точками сохранения можно также управлять в коде, вызывая методы 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
) перед созданием явной транзакции вы должны получить ссылку на текущую стратегию выполнения, которая применяется EF Core. Затем вызовите на этой стратегии метод 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
Поделиться с друзьями: