Поступать так придется в отношении всех команд CLI, приводимых в настоящей главе. После создания проектов обновите каждый файл *.csproj для включения ссылочных типов, допускающих null, из версии C# 8. Обновление выделено полужирным:

  net5.0

  enable

<p id="AutBody_Root956"><strong>Создание шаблонов для класса, производного от DbContext, и сущностных классов</strong></p>

Следующий шаг предусматривает формирование шаблонов для базы данных AutoLot из главы 21 с применением инструментов командной строки EF Core. Перейдите в каталог проекта AutoLot.Dal в окне командной строки или в консоли диспетчера пакетов Visual Studio.

На заметку! В папке Chapter_21 хранилища GitHub для этой книги находятся резервные копии базы данных, ориентированные на Windows и Docker. За инструкциями по восстановлению базы данных обращайтесь в главу 21.

Воспользуйтесь инструментами командной строки EF Core, чтобы сформировать для базы данных AutoLot шаблоны сущностных классов и класса, производного от DbContext. Вот как выглядит команда(которая должна вводиться в одной строке):

dotnet ef dbcontext scaffold "server=.,5433;Database=AutoLot;

User Id=sa;Password=P@ssw0rd;"

Microsoft.EntityFrameworkCore.SqlServer

 -d -c ApplicationDbContext --context-namespace

AutoLot.Dal.EfStructures --context-dir EfStructures

 --no-onconfiguring -n AutoLot.Models.

Entities -o ..\AutoLot.Models\Entities

Предыдущая команда формирует шаблоны для базы данных, находящейся по заданной строке подключения (для контейнера Docker, применяемого в главе 21), с использованием поставщика баз данных SQL Server. Флаг -d заставляет, где возможно, отдавать предпочтение аннотациям данных (перед Fluent API). В указывается имя контекста, в --context-namespaces — пространство имен для контекста, в --context-dir — каталог (относительно каталога текущего проекта) для контекста. С помощью --no-onconfiguring исключается метод OnConfiguring. В задается выходной каталог для файлов сущностных классов (относительно каталога текущего проекта) и, наконец, в -n — пространство имен для сущностных классов. Показанная выше команда помещает все сущности в каталог Entities проекта AutoLot.Models, а класс ApplicationDbContext — каталог EfStructures проекта AutoLot.Dal.

Вы заметите, что шаблон для хранимой процедуры не создавался. Если бы в базе данных присутствовали какие-то представления, то для них были бы созданы шаблоны сущностей без ключей. Поскольку в EF Core не предусмотрено конструкций, напрямую отображаемых на хранимые процедуры, создать шаблон невозможно. С применением EF Core можно создавать хранимые процедуры и другие объекты SQL, но на этот раз шаблоны формируются только для таблиц и представлений.

<p id="AutBody_Root957"><strong>Переключение на подход "сначала код"</strong></p>

Теперь, имея базу данных, для которой сформированы сущности, самое время переключиться с подхода "сначала база данных" на подход "сначала код". Для такого переключения должна быть создана фабрика контекстов, а также миграция из текущего состояния проекта. Затем либо база данных удаляется и воссоздается за счет применения миграции, либо задействуется фиктивная реализация для "обмана" инфраструктуры EF Core.

<p id="AutBody_Root958"><strong>Создание фабрики экземпляров класса, производного от DbContext, на этапе проектирования</strong></p>

Как было указано в главе 22, инструменты командной строки EF Core используют реализацию IDesignTimeDbContextFactory для создания экземпляра класса, производного от DbContext. Создайте в каталоге EfStructures проекта AutoLot.Dal новый файл класса по имени ApplicationDbContextFactory.cs. Добавьте в файл класса следующие пространства имен:

using System;

using Microsoft.EntityFrameworkCore;

using Microsoft.EntityFrameworkCore.Design;

Детали фабрики раскрывались в предыдущей главе, а здесь представлен только код. Для информационных целей посредством дополнительного вызова Console.WriteLine на консоль выводится строка подключения. Не забудьте привести строку подключения в соответствие со своей средой:

namespace AutoLot.Dal.EfStructures

{

   public class ApplicationDbContextFactory

     : IDesignTimeDbContextFactoryContext>

  {

Перейти на страницу:

Похожие книги