Шрифт:
Интервал:
Закладка:
Воспользуйтесь инструментами командной строки 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.ModelsEntities
Предыдущая команда формирует шаблоны для базы данных, находящейся по заданной строке подключения (для контейнера 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, но на этот раз шаблоны формируются только для таблиц и представлений.
Переключение на подход "сначала код"
Теперь, имея базу данных, для которой сформированы сущности, самое время переключиться с подхода "сначала база данных" на подход "сначала код". Для такого переключения должна быть создана фабрика контекстов, а также миграция из текущего состояния проекта. Затем либо база данных удаляется и воссоздается за счет применения миграции, либо задействуется фиктивная реализация для "обмана" инфраструктуры EF Core.
Создание фабрики экземпляров класса, производного от DbContext, на этапе проектирования
Как было указано в главе 22, инструменты командной строки EF Core используют реализацию IDesignTimeDbContextFactory для создания экземпляра класса, производного от DbContext. Создайте в каталоге EfStructures проекта AutoLot.Dal новый файл класса по имени ApplicationDbContextFactory.cs. Добавьте в файл класса следующие пространства имен:
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
Детали фабрики раскрывались в предыдущей главе, а здесь представлен только код. Для информационных целей посредством дополнительного вызова Console.WriteLine() на консоль выводится строка подключения. Не забудьте привести строку подключения в соответствие со своей средой:
namespace AutoLot.Dal.EfStructures
{
public class ApplicationDbContextFactory
: IDesignTimeDbContextFactory<ApplicationDbContext>
{
public ApplicationDbContext CreateDbContext(string[] args)
{
var optionsBuilder =
new DbContextOptionsBuilder<ApplicationDbContext>();
var connectionString = @"server=.,5433;Database=AutoLot;
User Id=sa;Password=P@ssw0rd;";
optionsBuilder.UseSqlServer(connectionString);
Console.WriteLine(connectionString);
return new ApplicationDbContext(optionsBuilder.Options);
}
}
}
Создание начальной миграции
Вспомните, что первая миграция создаст три файла: два файла с частичным классом миграции и еще один с полным моментальным снимком модели. Введите в окне командной строки показанную далее команду, находясь в каталоге AutoLot.Dal, чтобы создать новую миграцию по имени Initial (используя экземпляр только что полученного класса ApplicationDbContext) и поместить файлы миграции в каталог EfStructuresMigrations проекта AutoLot.Dal:
dotnet ef migrations add Initial -o EfStructuresMigrations
-c AutoLot.Dal.EfStructures.ApplicationDbContext
На заметку! Важно позаботиться о том, чтобы в сгенерированные файлы или базу данных не вносились изменения до тех пор, пока не будет создана и применена начальная миграция. Изменения на любой из сторон приведут к тому, что код и база данных утратят синхронизацию. После применения начальной миграции все изменения должны вноситься в базу данных через миграции EF Core.
Удостоверьтесь в том, что миграция была создана и ожидает применения, выполнив команду list:
dotnet ef migrations list -c AutoLot.Dal.EfStructures.ApplicationDbContext
- Понимание SQL - Мартин Грубер - Базы данных