KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
Перейти на страницу:

<b>[DbContext(typeof(ApplicationDbContext))]</b>

<b>[Migration(&quot;20201230020509_One2Many&quot;)]</b>

partial class One2Many

{

  protected override void BuildTargetModel(ModelBuilder modelBuilder)

  {

    ...

  }

}

Первая миграция создает внутри целевого каталога дополнительный файл, именуемый в соответствии с производным от

DbContext
классом, т.е.
&lt;ИмяПроизводногоОтDbContextКласса&gt;ModelSnapshot.cs
. Этот файл имеет формат, совпадающий с форматом конструирующего файла, и содержит код, который представляет собой итог всех миграций. При добавлении или удалении миграций данный файл автоматически обновляется, чтобы соответствовать изменениям.

На заметку! Крайне важно не удалять файлы миграций вручную. Удаление приведет к тому, что файл

&lt;ИмяПpoизвoднoгoOтDbContextKлacca&gt;ModelSnapshot.cs
утратит синхронизацию с вашими миграциями, по существу нарушив их работу. Если вы собираетесь удалять файлы миграций вручную, тогда удалите их все и начните сначала. Для удаления миграции используйте команду remove, которая будет описана ниже.

Исключение таблиц из миграций

Если какая-то сущность задействована сразу в нескольких

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

В версии EF Core 5 производный от

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

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

  modelBuilder.Entity&lt;LogEntry&gt;().ToTable(&quot;Logs&quot;,

    t =&gt; t.ExcludeFromMigrations());

}

Команда remove

Команда

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

Команда

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

Команда list

Команда

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

Язык программирования C#9 и платформа .NET5 - _168.png

Команда script

Команда

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

Язык программирования C#9 и платформа .NET5 - _169.png

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

script
, таблица
__EFMigrationsHistory
нe существует, то она создается. Кроме того, она будет обновляться для соответствия выполненным миграциям. Вот несколько примеров:

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

dotnet ef migrations script

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

dotnet ef migrations script 0 Many2Many

В табл. 22.14 представлены дополнительные параметры. Параметр

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

Язык программирования C#9 и платформа .NET5 - _170.png

Команды для управления базой данных

Для управления базой данных предназначены две команды,

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

Команда drop

Команда

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

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*