Обзор миграций
В реальных проектах модели данных изменяются по мере реализации функций. При добавлении или изменении новых сущностей или свойств схемы базы данных должны быть соответствующим образом изменены для синхронизации с приложением. Функция миграции в 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:
- Обычно рекомендуется использовать средства интерфейса командной строки .NET, которые работают на всех платформах.
- Если вы привыкли работать в Visual Studio или знакомы с миграциями EF6, можно также использовать средства консоли диспетчера пакетов.
Создание первой миграции
Теперь все готово к добавлению первой миграции. Укажите EF Core создать миграцию с именем InitialCreate:
dotnet ef migrations add InitialCreate
EF Core создаст в проекте каталог с именем Migrations и добавит несколько файлов. Рекомендуется проверить, какие именно файлы созданы в EF Core, и, возможно, исправить их, но сейчас мы это делать не будем.
Создание базы данных и схемы
На этом этапе в EF можно создать базу данных и схему из миграции. Это можно сделать с помощью следующих средств:
dotnet ef database update
Вот и все — ваше приложение готово к работе в новой базе данных, и вам не пришлось писать ни одной строки кода 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 обнаруживает, что был добавлен столбец, и добавляет соответствующую миграцию.
Теперь можно применить миграцию, как и раньше:
dotnet ef database update
Обратите внимание, что на этот раз EF обнаруживает, что база данных уже существует. Кроме того, когда была применена первая миграция, этот факт был записан в специальную таблицу журнала миграций в базе данных, что позволяет EF автоматически применять только новую миграцию.
Исключение частей модели
Иногда может потребоваться создать ссылки на типы из другого экземпляра DbContext. Это может привести к конфликтам миграции. Чтобы избежать этого, исключите тип из миграций одного из экземпляров DbContext.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<IdentityUser>()
.ToTable("AspNetUsers", t => t.ExcludeFromMigrations());
}
Следующие шаги
Приведенные выше сведения были лишь кратким описанием миграций. Дополнительную информацию об управлении миграциями, применении миграций и т. д. можно найти на других страницах документации. В справочнике по инструментам .NET Core CLI также содержатся полезные сведения о различных командах.
Дополнительные ресурсы
- Справочник по инструментам Entity Framework Core: .NET Core CLI — включает команды для обновления, удаления, добавления, отмены изменений и т. д.
- Справочник по инструментам Entity Framework Core: консоль диспетчера пакетов в Visual Studio — включает команды для обновления, удаления, добавления, отмены изменений и т. д.
- Мероприятие .NET Data Community Standup, посвященное новым функциями миграции в EF Core 5.0.