Руководство. Часть 5. Применение миграции к примеру Contoso University

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

Изучив это руководство, вы:

  • Дополнительные сведения о миграциях
  • Создание первоначальной миграции
  • Обзор методов Up и Down
  • Дополнительные сведения о моментальном снимке модели данных
  • Применение миграции

Необходимые компоненты

Сведения о миграциях

При разработке нового приложения ваша модель данных часто меняется, и при каждом таком изменении она нарушает синхронизацию с базой данных. Вы начали работу с этими руководствами, настроив Entity Framework для создания базы данных, если она еще не существует. Затем при каждом изменении модели данных — добавлении, удалении или изменении классов сущностей или изменении класса DbContext — вы можете удалить базу данных, после чего EF создает новую, которая соответствует данной модели, и заполняет ее тестовыми данными.

Этот способ для обеспечения синхронизации базы данных с моделью данных хорошо работает до развертывания приложения в рабочей среде. Когда приложение выполняется в рабочей среде, оно обычно хранит данные, которые вы хотите сохранить, и вам нежелательно терять все при каждом изменении, например при добавлении нового столбца. Функция EF Core миграции решает эту проблему, позволяя EF обновить схему базы данных вместо создания новой базы данных.

Для миграции можно использовать консоль диспетчера пакетов (PMC) или CLI. Эти руководства демонстрируют использование команд интерфейса командной строки. Дополнительные сведения о PMC приведены в конце этого руководства.

Удалите базу данных:

Установите EF Core средства в качестве глобального средства и удалите базу данных:

dotnet tool install --global dotnet-ef
dotnet ef database drop

Примечание.

По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, --arch. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.

Следующий раздел описывает выполнение команд интерфейса командной строки.

Создание первоначальной миграции

Сохраните изменения и выполните сборку проекта. После этого откройте командное окно и в папку проекта. Вот как это можно сделать быстро:

  • Щелкните правой кнопкой мыши проект в обозревателе решений и выберите в контекстном меню пункт Открыть папку в проводнике.

    Open in File Explorer menu item

  • Введите "cmd" в адресной строке и нажмите клавишу ВВОД.

    Open command window

Введите в командном окне следующую команду:

dotnet ef migrations add InitialCreate

Приведенные выше команды выводят результат наподобие следующего:

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Done. To undo this action, use 'ef migrations remove'

Если отображается сообщение об ошибке "Доступ к файлу... ContosoUniversity.dll невозможен, так как файл используется другим процессом", найдите значок IIS Express в области уведомлений Windows, щелкните его правой кнопкой мыши, а затем выберите ContosoUniversity > Остановить сайт.

Обзор методов Up и Down

При выполнении команды migrations add система EF сформировала код, который создаст базу данных с нуля. Этот код находится в файле <timestamp>_InitialCreate.cs внутри папки Migrations. Метод Up класса InitialCreate создает таблицы базы данных, которые соответствуют наборам сущностей модели данных, а метод Down удаляет их, как показано в следующем примере.

public partial class InitialCreate : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Course",
            columns: table => new
            {
                CourseID = table.Column<int>(nullable: false),
                Credits = table.Column<int>(nullable: false),
                Title = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Course", x => x.CourseID);
            });

        // Additional code not shown
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Enrollment");
        // Additional code not shown
    }
}

Функция миграций вызывает метод Up, чтобы реализовать изменения модели данных для миграции. При вводе команды для отката обновления функция миграций вызывает метод Down.

Этот пример кода предназначен для первоначальной миграции, созданной при вводе команды migrations add InitialCreate. Параметр имени миграции (в примере это "InitialCreate") используется в качестве имени файла и может быть любым. Рекомендуется выбрать слово или фразу, которые кратко описывают назначение миграции. Например, последнюю миграцию можно назвать "AddDepartmentTable".

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

Моментальный снимок модели данных

Миграции создают моментальный снимок текущей схемы базы данных.Migrations/SchoolContextModelSnapshot.cs При добавлении миграции EF определяет, что именно изменилось, сравнивая модель данных с файлом моментального снимка.

Для удаления миграции используйте команду dotnet ef migrations remove. dotnet ef migrations remove удаляет миграцию и гарантирует корректный сброс моментального снимка. В случае сбоя dotnet ef migrations remove используйте dotnet ef migrations remove -v, чтобы получить сведения об ошибке.

Дополнительные сведения об использовании файла моментального снимка см. в разделе EF Core "Миграции в средах групп".

Применение миграции

Введите следующую команду в командном окне, чтобы создать базу данных и таблицы в ней.

dotnet ef database update

Выходные данные команды аналогичны команде migrations add, за исключением того, что вы видите журналы для команд SQL, настраивающих базу данных. В приведенном ниже примере выходных данных большинство журналов опущено. Если вы предпочитаете не видеть этот уровень детализации в сообщениях журнала, вы можете изменить уровень журнала в appsettings.Development.json файле. Дополнительные сведения см. в разделе Ведение журнала в .NET Core и ASP.NET Core.

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (274ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
      CREATE DATABASE [ContosoUniversity2];
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (60ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
      IF SERVERPROPERTY('EngineEdition') <> 5
      BEGIN
          ALTER DATABASE [ContosoUniversity2] SET READ_COMMITTED_SNAPSHOT ON;
      END;
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (15ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      CREATE TABLE [__EFMigrationsHistory] (
          [MigrationId] nvarchar(150) NOT NULL,
          [ProductVersion] nvarchar(32) NOT NULL,
          CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
      );

<logs omitted for brevity>

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
      VALUES (N'20190327172701_InitialCreate', N'5.0-rtm');
Done.

Используйте обозреватель объектов SQL Server для проверки базы данных, как описано в первом руководстве. Вы заметите добавление таблицы __EFMigrationsHistory, отслеживающей миграции, которые были применены к базе данных. Просмотрев данные в этой таблице, вы увидите одну строку для первой миграции. (Последний журнал в предыдущем примере выходных данных интерфейса командной строки показывает оператор INSERT, создающий эту строку.)

Запустите приложение, чтобы убедиться, что все работает, как и раньше.

Students Index page

Сравнение CLI и PMC

Средства EF для управления миграциями доступны в виде команд интерфейса командной строки .NET Core или командлетов PowerShell в окне консоли диспетчера пакетов Visual Studio. Это руководство описывает использование интерфейса командной строки, но вы можете использовать и консоль диспетчера пакетов.

Команды EF для команд консоли диспетчера пакетов находятся в пакете Microsoft.EntityFrameworkCore.Tools. Этот пакет входит в метапакет Microsoft.AspNetCore.App, поэтому если приложение уже содержит ссылку на пакет Microsoft.AspNetCore.App, добавлять ссылку на пакет не нужно.

Важно. Это не тот же пакет, который вы устанавливаете для ИНТЕРФЕЙСА командной строки, изменив .csproj файл. Его имя заканчивается на Tools, а имя пакета интерфейса командной строки — на Tools.DotNet.

Дополнительные сведения о командах интерфейса командной строки см. в разделе .NET Core CLI.

Дополнительные сведения о командах консоли диспетчера пакетов см. в разделе Консоль диспетчера пакетов (Visual Studio).

Получение кода

Скачайте или ознакомьтесь с готовым приложением.

Следующий шаг

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