Чтение онлайн

ЖАНРЫ

Язык программирования 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

Поделиться с друзьями: