Обзор миграций

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

В общем миграции работают следующим образом.

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

Оставшаяся часть этой страницы представляет собой пошаговое руководство для начинающих по использованию миграций. Дополнительные сведения см. на других страницах этого раздела.

Начало работы

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

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
}

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

Установка инструментов

Во-первых, необходимо установить средства командной строки EF Core:

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

Теперь все готово к добавлению первой миграции. Укажите EF Core создать миграцию с именем InitialCreate:

dotnet ef migrations add InitialCreate

EF Core создаст в проекте каталог с именем Migrations и добавит несколько файлов. Рекомендуется проверить, какие именно файлы созданы в EF Core, и, возможно, исправить их, но сейчас мы это делать не будем.

Создание базы данных и схемы

На этом этапе в EF можно создать базу данных и схему из миграции. Это можно сделать с помощью следующих средств:

Вот и все — ваше приложение готово к работе в новой базе данных, и вам не пришлось писать ни одной строки кода SQL. Обратите внимание, что такой способ применения миграций идеально подходит для локальной разработки и хуже подходит для рабочих сред. Дополнительные сведения см. на странице применения миграций.

Развитие модели

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

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedTimestamp { get; set; }
}

Но модель и рабочая база данных не синхронизированы, поэтому необходимо добавить новый столбец в схему базы данных. Создадим новую миграцию для этой задачи:

dotnet ef migrations add AddBlogCreatedTimestamp

Обратите внимание, что миграциям задается описательное имя, чтобы в дальнейшем упростить чтение и понимание журнала проекта.

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

Теперь можно применить миграцию, как и раньше:

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

Исключение частей модели

Примечание

Эта возможность появилась в EF Core 5.0.

Иногда может потребоваться создать ссылки на типы из другого экземпляра DbContext. Это может привести к конфликтам миграции. Чтобы избежать этого, исключите тип из миграций одного из экземпляров DbContext.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<IdentityUser>()
        .ToTable("AspNetUsers", t => t.ExcludeFromMigrations());
}

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

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

Дополнительные ресурсы