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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 426 427 428 429 430 431 432 433 434 ... 642

<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), который обеспечивает выполнение отката последней миграции и ее удаление за один шаг.

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

Команда list

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

Команда script

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

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

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

dotnet ef migrations script

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

dotnet ef migrations script 0 Many2Many

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

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

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

Команда drop

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

1 ... 426 427 428 429 430 431 432 433 434 ... 642
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Похожие на Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю книги

Оставить комментарий