Команда add требует передачи параметра name, который используется при именовании созданного класса и файлов для миграции. В дополнение к общим параметрам параметр -о <путь> или --output-dir <путь> указывает, куда должны помещаться файлы миграции. Стандартный каталог называется Migrations и относителен к текущему пути.

Для каждой добавленной миграции создаются два файла с частичными определениями того же самого класса. Имена обоих файлов начинаются с отметки времени и наименования миграции, которое было указано в качестве параметра для команды add. Первый файл называется <ГГГГММДДЧЧММСС>_<НаименованиеМиграции>.cs, а второй — <ГГГГММДДЧЧММСС>_<НаименованиеМиграции>.Designer.cs. Отметка времени основана на том, когда файл был создан, и в точности совпадает для обоих файлов. Первый файл представляет код, сгенерированный для изменений базы данных в этой миграции, а конструирующий файл — код, который предназначен для создания и обновления базы данных на основе всех миграций до этой миграции включительно.

Главный файл содержит два метода, Up() и Down(). В методе Up() находится код для обновления базы данных с учетом изменений этой миграции. В методе Down() содержится код для выполнения отката изменений этой миграции. Ниже приведен неполный листинг начальной миграции, рассматриваемой ранее в главе (One2Many):

public partial class One2Many : Migration

{

  protected override void Up(MigrationBuilder migrationBuilder)

  {

    migrationBuilder.CreateTable(

      name: "Make",

      columns: table => new

        {

          Id = table.Column(type: "int", nullable: false)

            .Annotation("SqlServer:Identity", "1, 1"),

          Name = table.Column(type: "nvarchar(max)", nullable: true),

          TimeStamp = table.Column(type: "varbinary(max)",

                                           nullable: true)

        },

        constraints: table =>

        {

          table.PrimaryKey("PK_Make", x => x.Id);

        });

    ...

    migrationBuilder.CreateIndex(

      name: "IX_Cars_MakeId",

      table: "Cars",

      column: "MakeId");

  }

  protected override void Down(MigrationBuilder migrationBuilder)

  {

    migrationBuilder.DropTable(name: "Cars");

    migrationBuilder.DropTable(name: "Make");

  }

}

Как видите, метод Up() создает таблицы, столбцы, индексы и т.д. Метод Down() удаляет созданные элементы. По мере необходимости механизм миграции будет выдавать операторы alter, add и drop, чтобы гарантировать соответствие базы данных вашей модели.

Конструирующий файл содержит два атрибута, которые связывают частичные определения с именем файла и классом, производным от DbContext. Ниже показан фрагмент листинга конструирующего класса с упомянутыми атрибутами:

[DbContext(typeof(ApplicationDbContext))]

[Migration("20201230020509_One2Many")]

partial class One2Many

{

  protected override void BuildTargetModel(ModelBuilder modelBuilder)

  {

    ...

  }

}

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

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

<p id="AutBody_Root943"><strong>Исключение таблиц из миграций</strong></p>
Перейти на страницу:

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