Язык программирования C#9 и платформа .NET5
<b>[DbContext(typeof(ApplicationDbContext))]</b><b>[Migration("20201230020509_One2Many")]</b>partial class One2Many{protected override void BuildTargetModel(ModelBuilder modelBuilder){...}}Первая миграция создает внутри целевого каталога дополнительный файл, именуемый в соответствии с производным от
классом, т.е.DbContext. Этот файл имеет формат, совпадающий с форматом конструирующего файла, и содержит код, который представляет собой итог всех миграций. При добавлении или удалении миграций данный файл автоматически обновляется, чтобы соответствовать изменениям.<ИмяПроизводногоОтDbContextКласса>ModelSnapshot.csНа заметку! Крайне важно не удалять файлы миграций вручную. Удаление приведет к тому, что файл
утратит синхронизацию с вашими миграциями, по существу нарушив их работу. Если вы собираетесь удалять файлы миграций вручную, тогда удалите их все и начните сначала. Для удаления миграции используйте команду remove, которая будет описана ниже.<ИмяПpoизвoднoгoOтDbContextKлacca>ModelSnapshot.csИсключение таблиц из миграций
Если какая-то сущность задействована сразу в нескольких
, то каждыйDbContextбудет создавать код в файлах миграций для любых изменений, вносимых в эту сущность. В результате возникает проблема, потому что второй сценарий миграции потерпит неудачу, если изменения уже внесены в базу данных. До выхода версии EF Core 5 единственным решением было ручное редактирование одного из файлов миграций с целью удаления таких изменений.DbContextВ версии EF Core 5 производный от
класс может помечать сущность как исключенную из миграций, позволяя другомуDbContextстановиться системой записи для данной сущности. В следующем коде сущность исключается из миграций:DbContextprotected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.Entity<LogEntry>().ToTable("Logs",t => t.ExcludeFromMigrations());}Команда remove
Команда
применяется для удаления миграций из проекта и всегда работает с последней миграцией (основываясь на отметках времени миграций). При удалении миграции исполняющая среда EF Core проверяет, не была ли миграция применена к базе данных, с помощью таблицыremove. Если миграция применялась, тогда процесс терпит неудачу. Если же миграция не применялась или была подвергнута откату, то она удаляется, а файл моментального снимка модели обновляется.__EFMigrationsHistoryКоманда
не принимает какие-либо параметры (поскольку всегда работает с последней миграцией) и использует те же самые параметры, что и командаremove, плюс дополнительный параметрadd, который обеспечивает выполнение отката последней миграции и ее удаление за один шаг.force(—f || --force)Команда list
Команда
позволяет получить все миграции для класса, производного отlist. По умолчанию она выводит список всех миграций и запрашивает базу данных с целью выяснения, были ли они применены. Если миграции не применялись, то они будут помечены как ожидающие. Один из параметров командыDbContextпредназначен для передачи специальной строки подключения, а другой позволяет вообще не подключаться к базе данных и просто вывести список миграций (табл. 22.12).listКоманда script
Команда
создает сценарий SQL на основе одной или большего количества миграций и принимает два необязательных параметра, которые указывают, с какой миграции начинать и на какой миграции заканчивать. Если ни один параметр не задан, то сценарий создается для всех миграций. Параметры описаны в табл. 22.13.scriptЕсли миграции не указаны, тогда созданный сценарий станет совокупным итогом всех миграций. В случае предоставления миграций сценарий будет содержать изменения между двумя миграциями (включительно). Каждая миграция помещается внутрь транзакции. Если в базе данных, где запускается команда
, таблицаscriptнe существует, то она создается. Кроме того, она будет обновляться для соответствия выполненным миграциям. Вот несколько примеров:__EFMigrationsHistory// Создать сценарий для всех миграций.dotnet ef migrations script// Создать сценарий для миграций от начальной до Мапу2Мапу включительно.dotnet ef migrations script 0 Many2ManyВ табл. 22.14 представлены дополнительные параметры. Параметр
позволяет указать файл для сценария (в каталоге, относительном к тому, где запускается команда), а параметр-осоздает идемпотентный сценарий (который содержит проверку, применялась ли уже миграция, и если применялась, то пропускает ее). Параметр-iотключает добавление транзакций в сценарий.--no-transactionКоманды для управления базой данных
Для управления базой данных предназначены две команды,
иdrop. Командаupdateудаляет базу данных, если она существует, а командаdropобновляет базу данных с использованием миграций.updateКоманда drop
Команда
удаляет базу данных, указанную в строке подключения внутри методаdropпроизводного отOnConfiguring()класса. С помощью параметраDbContextможно отключить запрос на подтверждение и принудительно закрыть все подключения (табл. 22.15).force


