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

В версии EF Core 5 производный от DbContext класс может помечать сущность как исключенную из миграций, позволяя другому DbContext становиться системой записи для данной сущности. В следующем коде сущность исключается из миграций:

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

  modelBuilder.Entity().ToTable("Logs",

    t => t.ExcludeFromMigrations());

}

<p id="AutBody_Root944"><strong>Команда remove</strong></p>

Команда remove применяется для удаления миграций из проекта и всегда работает с последней миграцией (основываясь на отметках времени миграций). При удалении миграции исполняющая среда EF Core проверяет, не была ли миграция применена к базе данных, с помощью таблицы __EFMigrationsHistory. Если миграция применялась, тогда процесс терпит неудачу. Если же миграция не применялась или была подвергнута откату, то она удаляется, а файл моментального снимка модели обновляется.

Команда remove не принимает какие-либо параметры (поскольку всегда работает с последней миграцией) и использует те же самые параметры, что и команда add, плюс дополнительный параметр force(—f || --force), который обеспечивает выполнение отката последней миграции и ее удаление за один шаг.

<p id="AutBody_Root945"><strong>Команда list</strong></p>

Команда list позволяет получить все миграции для класса, производного от DbContext. По умолчанию она выводит список всех миграций и запрашивает базу данных с целью выяснения, были ли они применены. Если миграции не применялись, то они будут помечены как ожидающие. Один из параметров команды list предназначен для передачи специальной строки подключения, а другой позволяет вообще не подключаться к базе данных и просто вывести список миграций (табл. 22.12).

<p id="AutBody_Root946"><strong>Команда script</strong></p>

Команда script создает сценарий SQL на основе одной или большего количества миграций и принимает два необязательных параметра, которые указывают, с какой миграции начинать и на какой миграции заканчивать. Если ни один параметр не задан, то сценарий создается для всех миграций. Параметры описаны в табл. 22.13.

Если миграции не указаны, тогда созданный сценарий станет совокупным итогом всех миграций. В случае предоставления миграций сценарий будет содержать изменения между двумя миграциями (включительно). Каждая миграция помещается внутрь транзакции. Если в базе данных, где запускается команда script, таблица __EFMigrationsHistory нe существует, то она создается. Кроме того, она будет обновляться для соответствия выполненным миграциям. Вот несколько примеров:

// Создать сценарий для всех миграций.

dotnet ef migrations script

// Создать сценарий для миграций от начальной до Мапу2Мапу включительно.

dotnet ef migrations script 0 Many2Many

В табл. 22.14 представлены дополнительные параметры. Параметр позволяет указать файл для сценария (в каталоге, относительном к тому, где запускается команда), а параметр -i создает идемпотентный сценарий (который содержит проверку, применялась ли уже миграция, и если применялась, то пропускает ее). Параметр --no-transaction отключает добавление транзакций в сценарий.

<p id="AutBody_Root947"><strong>Команды для управления базой данных</strong></p>

Для управления базой данных предназначены две команды, drop и update. Команда drop удаляет базу данных, если она существует, а команда update обновляет базу данных с использованием миграций.

<p id="AutBody_Root948"><strong>Команда drop</strong></p>

Команда drop удаляет базу данных, указанную в строке подключения внутри метода OnConfiguring() производного от DbContext класса. С помощью параметра force можно отключить запрос на подтверждение и принудительно закрыть все подключения (табл. 22.15).

<p id="AutBody_Root949"><strong>Команда update</strong></p>

Команда update принимает параметр с именем миграции и обычные параметры. Она имеет один дополнительный параметр --connection <подключение>, позволяющий использовать строку подключения, которая не была сконфигурирована заранее.

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

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