В настоящей главе вы начали ознакомление с инфраструктурой Entity Framework Core. В ней были исследованы аспекты, лежащие в основе EF Core, выполнения запросов и отслеживания изменений. Вы узнали о придании формы своей модели, соглашениях EF Core, аннотациях данных и Fluent API, а также о том, как их применение влияет на проектное решение для базы данных. Наконец, вы научились пользоваться мощным интерфейсом командной строки EF Core и глобальными инструментами.
Наряду с тем, что в этой главе было предложено много теоретических сведений и мало кода, следующая глава содержит главным образом код и совсем немного теории. По завершении проработки материалов главы 23 в вашем распоряжении
появится законченный уровень доступа к данным
AutoLot
.
Глава 23
Построение уровня доступа к данным с помощью Entity Framework Core
В предыдущей главе раскрывались детали и возможности инфраструктуры EFCore. Текущая глава сосредоточена на применении того, что вы узнали об инфраструктуре EF Core, для построения уровня доступа к данным
AutoLot
. В начале главы строятся шаблоны сущностей и производного от
DbContext
класса для базы данных из предыдущей главы. Затем используемый в проекте подход "сначала база данных" меняется на подход "сначала код", а сущности обновляются до своей финальной версии и применяются к базе данных с использованием миграций EF Core. Последним изменением, внесенным в базу данных, будет воссоздание хранимой процедуры
GetPetName
и создание нового представления базы данных (в комплекте с соответствующей моделью представления), что делается с помощью миграций.
Следующий шаг — формирование хранилищ, обеспечивающих изолированный доступ для создания, чтения, обновления и удаления (create, read, update, delete — CRUD) базы данных. Далее в целях тестирования к проекту будет добавлен код инициализации данных вместе с выборочными данными. Остаток главы посвящен испытаниям уровня доступа к данным
AutoLot
посредством автоматизированных интеграционных тестов.
"Сначала код" или "сначала база данных"
Прежде чем приступить к построению уровня доступа к данным, давайте обсудим два способа работы с EF Core и базой данных: "сначала код" или "сначала база данных". Оба они совершенно допустимы, а выбор применяемого подхода в значительной степени зависит от самой команды разработчиков.
Подход "сначала код" означает, что вы создаете и конфигурируете свои сущностные классы и производный от
DbContext
класс в коде и затем используете миграции для обновления базы данных. Подобным образом разрабатывается большинство новых проектов. Преимущество подхода "сначала код" заключается в том, что в ходе построения приложения сущности развиваются на основе имеющихся у него потребностей. Миграции поддерживают синхронизацию с базой данных, поэтому проектное решение базы данных эволюционирует вместе с приложением. Такой развивающийся процесс проектирования популярен в командах гибкой разработки, поскольку он обеспечивает создание нужных частей в надлежащее время.
Если у вас уже есть база данных или вы предпочитаете, чтобы проектное решение базы данных управляло разрабатываемым приложением, тогда должен применяться подход "сначала база данных". Вместо создания производного от
DbContext
класса и всех сущностных классов вручную вы формируете шаблоны классов из базы данных. В случае изменения базы данных вам придется заново сформировать шаблоны классов для сохранения своего кода в синхронизированном с базой данных состоянии. Любой специальный код в сущностных классах или в классе, производном от
DbContext
, должен быть помещен в частичные классы, чтобы он не переписывался при повторном создании шаблонов классов. К счастью, именно по этой причине процесс формирования шаблонов строит частичные классы.
Какой бы подход вы ни выбрали, "сначала
код" или "сначала база данных", имейте в виду, что он является обязательством. Если вы используете подход "сначала код", то все изменения вносятся в классы сущностей и контекста, а база данных обновляется с применением миграций. Если вы используете подход "сначала база данных", то все изменения должны вноситься в базу данных, после чего будет требоваться повторное создание шаблонов классов. Приложив некоторые усилия по планированию, вы можете переключаться с подхода "сначала база данных" на подход "сначала код" (и наоборот), но не должны вручную вносить изменения в код и базу данных одновременно.
Создание проектов AutoLot.Dal и AutoLot.Models
Уровень доступа к данным
AutoLo
t состоит из двух проектов, один из которых содержит код, специфичный для EF Core (производный от
DbContext
класс, фабрику контекстов, хранилища, миграции и т.д.), а другой — сущности имодели представлений. Создайте новое решение под названием
Chapter23_AllProjects
и добавьте в него проект библиотеки классов .NET Core по имени
AutoLot.Models
. Удалите стандартный класс, созданный шаблоном, и добавьте в проект следующие пакеты NuGet:
Microsoft.EntityFrameworkCore.Abstractions
System.Text.Json
Пакет
Microsoft.EntityFrameworkCore.Abstractions
обеспечивает доступ ко многим конструкциям EF Core (вроде аннотаций данных) и легковеснее пакета
Microsoft.EntityFrameworkCore
. Добавьте в решение еще один проект библиотеки классов .NET Core по имени
AutoLot.Dal
. Удалите стандартный класс, сгенерированный шаблоном, включите ссылку на проект
AutoLot.Models
и добавьте в проект перечисленные далее пакеты NuGet:
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Design
Пакет
Microsoft.EntityFrameworkCore
предоставляет общую функциональность для EF Core. Пакет
Microsoft.EntityFrameworkCore.SqlServer
предлагает поставщик данных SQL, а пакет
Microsoft.EntityFrameworkCore.Design
требуется для инструментов командной строки EF Core.
Чтобы выполнить все указанные ранее шаги в командной строке, введите показанные ниже команды (в каталоге, где хотите создать решение):