Преимущество инфраструктуры EF Core, применяющей шаблон поставщиков баз данных ADO.NET, заключается в том, что она позволяет объединять в одном проекте парадигмы доступа к данным EF Core и ADO.NET, расширяя ваши возможности. Например, в случае использования EF Core с целью предоставления подключения, схемы и имени таблицы для операций массового копирования задействуются возможности сопоставления EF Core и функциональность программы массового копирования, встроенная в ADO.NET. Такой смешанный подход делает EF Core просто еще одним инструментом в вашем арсенале.
Когда вы оцените объем связующего кода для базового доступа к данным, поддерживаемый инфраструктурой EF Core в согласованной и эффективной манере, по всей видимости,
она станет вашим основным механизмом при доступе к данным.
На заметку! Многие сторонние СУБД (скажем, Oracle и MySQL) предлагают поставщики данных, осведомленные об инфраструктуре EF Core. Если вы имеете дело не с SQL Server, тогда обратитесь за детальными сведениями к разработчику СУБД или ознакомьтесь с перечнем доступных поставщиков данных EF Core по ссылке
Инфраструктура EF Core лучше всего вписывается в процесс разработки в случае применения подходов в стиле "формы поверх данных" (или "API-интерфейс поверх данных"). Оптимальными для EF Core являются операции над небольшим количеством сущностей, использующие шаблон единицы работы с целью обеспечения согласованности. Она не очень хорошо подходит для выполнения крупномасштабных операций над данными вроде тех, что встречаются приложениях хранилищ данных типа "извлечение, трансформация, загрузка" (extract-transform-load — ETL) или в больших системах построения отчетов.
Строительные блоки Entity Framework Core
К главным компонентам EF Core относятся
DbContext
,
ChangeTracker
, специализированный тип коллекции
DbSet
, поставщики баз данных и сущности приложения. Для проработки примеров в текущем разделе создайте новый проект консольного приложения по имени
входит в состав главных компонентов EF Core и предоставляет доступ к базе данных через свойство
Database
. Объект
DbContext
управляет экземпляром
ChangeTracker
, поддерживает виртуальный метод
OnModelCreating
для доступа к текучему API-интерфейсу (Fluent API), хранит все свойства
DbSet<T>
и предлагает метод
SaveChanges
, позволяющий сохранять данные в хранилище. Он применяется не напрямую, а через специальный класс, унаследованный от
DbContext
. Именно в этом классе размещены все свойства типа
DbSet<T>
. В табл. 22.1 описаны некоторые часто используемые члены класса
DbContext
.
Создание
класса, производного от DbContext
Первый шаг в EF Core заключается в создании специального класса, унаследованного от
DbContext
. Затем добавляется конструктор, который принимает строго типизированный экземпляр
DbContextOptions
(рассматривается далее) и передает его конструктору базового класса:
namespace AutoLot.Samples
{
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
}
Именно производный от
DbContext
класс применяется для доступа к базе данных и работает с сущностями, средством отслеживания изменений и всеми компонентами EF Core.
Конфигурирование экземпляра DbContext
Экземпляр
DbContext
конфигурируется с использованием экземпляра класса
DbContextOptions
. Экземпляр
DbContextOptions
создается с применением
DbContextOptionsBuilder
, т.к. класс
DbContextOptions
не рассчитан на создание экземпляров непосредственно в коде. Через экземпляр
DbContextOptionsBuilder
выбирается поставщик базы данных (наряду с любыми настройками, касающимися поставщика) и устанавливаются общие параметры экземпляра
DbContext
инфраструктуры EF Core (наподобие ведения журнала). Затем свойство
Options
внедряется в базовый класс
DbContext
во время выполнения.
Такая возможность динамического конфигурирования позволяет изменять настройки во время выполнения, просто выбирая разные параметры (скажем, поставщик MySQL вместо SQL Server) и создавая новый экземпляр производного класса
DbContext
.
Фабрика DbContext этапа проектирования
Фабрика
DbContext
этапа проектирования представляет собой класс, который реализует интерфейс
IDesignTimeDbContextFactory<T>
, где
Т
— класс, производный от
DbContext
. Интерфейс
IDesignTimeDbContextFactory<T>
имеет один метод
CreateDbContext
, который должен быть реализован для создания экземпляра производного класса
DbContext
.
В показанном ниже классе
ApplicationDbContextFactory
с помощью метода
CreateDbContext
создается строго типизированный экземпляр
DbContextOptionsBuilder
для класса
ApplicationDbContext
, устанавливается поставщик баз данных SQL Server (с использованием строки подключения к экземпляру Docker из главы 21), после чего создается и возвращается новый экземпляр