Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Воспользуйтесь инструментами командной строки EF Core, чтобы сформировать для базы данных
AutoLotDbContextdotnet 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-с--context-namespaces--context-dir--no-onconfiguringOnConfiguring()-о-nEntitiesAutoLot.ModelsApplicationDbContextEfStructuresAutoLot.DalВы заметите, что шаблон для хранимой процедуры не создавался. Если бы в базе данных присутствовали какие-то представления, то для них были бы созданы шаблоны сущностей без ключей. Поскольку в EF Core не предусмотрено конструкций, напрямую отображаемых на хранимые процедуры, создать шаблон невозможно. С применением EF Core можно создавать хранимые процедуры и другие объекты SQL, но на этот раз шаблоны формируются только для таблиц и представлений.
Переключение на подход "сначала код"
Теперь, имея базу данных, для которой сформированы сущности, самое время переключиться с подхода "сначала база данных" на подход "сначала код". Для такого переключения должна быть создана фабрика контекстов, а также миграция из текущего состояния проекта. Затем либо база данных удаляется и воссоздается за счет применения миграции, либо задействуется фиктивная реализация для "обмана" инфраструктуры EF Core.
Создание фабрики экземпляров класса, производного от DbContext, на этапе проектирования
Как было указано в главе 22, инструменты командной строки EF Core используют реализацию
IDesignTimeDbContextFactoryDbContextEfStructuresAutoLot.DalApplicationDbContextFactory.csusing 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.DalInitialApplicationDbContextEfStructuresMigrationsAutoLot.Daldotnet ef migrations add Initial -o EfStructuresMigrations -c AutoLot.Dal.EfStructures.ApplicationDbContextНа заметку! Важно позаботиться о том, чтобы в сгенерированные файлы или базу данных не вносились изменения до тех пор, пока не будет создана и применена начальная миграция. Изменения на любой из сторон приведут к тому, что код и база данных утратят синхронизацию. После применения начальной миграции все изменения должны вноситься в базу данных через миграции EF Core.
Удостоверьтесь в том, что миграция была создана и ожидает применения, выполнив команду
listdotnet ef migrations list -c AutoLot.Dal.EfStructures.ApplicationDbContext