Язык программирования C#9 и платформа .NET5
Создание класса, производного от DbContext
Первый шаг в EF Core заключается в создании специального класса, унаследованного от
. Затем добавляется конструктор, который принимает строго типизированный экземплярDbContext(рассматривается далее) и передает его конструктору базового класса:DbContextOptionsnamespace AutoLot.Samples{public class ApplicationDbContext : DbContext{public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options): base(options){}}}Именно производный от
класс применяется для доступа к базе данных и работает с сущностями, средством отслеживания изменений и всеми компонентами EF Core.DbContextКонфигурирование экземпляра DbContext
Экземпляр
конфигурируется с использованием экземпляра классаDbContext. ЭкземплярDbContextOptionsсоздается с применениемDbContextOptions, т.к. классDbContextOptionsBuilderне рассчитан на создание экземпляров непосредственно в коде. Через экземплярDbContextOptionsвыбирается поставщик базы данных (наряду с любыми настройками, касающимися поставщика) и устанавливаются общие параметры экземпляраDbContextOptionsBuilderинфраструктуры EF Core (наподобие ведения журнала). Затем свойствоDbContextвнедряется в базовый классOptionsво время выполнения.DbContextТакая возможность динамического конфигурирования позволяет изменять настройки во время выполнения, просто выбирая разные параметры (скажем, поставщик MySQL вместо SQL Server) и создавая новый экземпляр производного класса
.DbContextФабрика DbContext этапа проектирования
Фабрика
этапа проектирования представляет собой класс, который реализует интерфейсDbContext, гдеIDesignTimeDbContextFactory<T>— класс, производный отТ. ИнтерфейсDbContextимеет один методIDesignTimeDbContextFactory<T>, который должен быть реализован для создания экземпляра производного классаCreateDbContext().DbContextВ показанном ниже классе
с помощью методаApplicationDbContextFactoryсоздается строго типизированный экземплярCreateDbContext()для классаDbContextOptionsBuilder, устанавливается поставщик баз данных SQL Server (с использованием строки подключения к экземпляру Docker из главы 21), после чего создается и возвращается новый экземплярApplicationDbContext:ApplicationDbContextusing System;using Microsoft.EntityFrameworkCore;using Microsoft.EntityFrameworkCore.Design;namespace AutoLot.Samples{public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>{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);}}}Интерфейс командной строки задействует фабрику контекстов, чтобы создать экземпляр производного класса
, предназначенный для выполнения действий вроде создания и применения миграций базы данных. Поскольку фабрика является конструкцией этапа проектирования и не используется во время выполнения, строка подключения к базе данных разработки обычно будет жестко закодированной. В версии EF Core 5 появилась возможность передавать методуDbContextаргументы из командной строки, о чем пойдет речь позже в главе.CreateDbContext()Метод OnModelCreating()
Базовый класс
открывает доступ к методуDbContext, который применяется для придания формы сущностям, используя Fluent API. Детали подробно раскрываются далее в главе, а пока добавьте в классOnModelCreating()следующий код:ApplicationDbContextprotected override void OnModelCreating(ModelBuilder modelBuilder){// Обращения к Fluent API.OnModelCreatingPartial(modelBuilder);}partial void OnModelCreatingPartial(ModelBuilder modelBuilder);Сохранение изменений
Чтобы заставить
иDbContextсохранить любые изменения, внесенные в отслеживаемые сущности, вызовите методChangeTracker(илиSaveChanges()) на экземпляре класса, производного отSaveChangesAsync():DbContext
