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

В реальных проектах модели данных изменяются по мере реализации функций. При добавлении или изменении новых сущностей или свойств схемы базы данных должны быть соответствующим образом изменены для синхронизации с приложением. Функция миграции в 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 автоматически применять только новую миграцию.

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

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

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

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

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

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