Что такое миграции (Migrations) в Entity Framework Core?

«Что такое миграции (Migrations) в Entity Framework Core?» — вопрос из категории Entity Framework, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Миграции в EF Core — это система контроля версий для схемы базы данных. Она позволяет синхронизировать модель данных в коде (ваши классы-сущности DbContext и DbSet) со структурой реальной реляционной базы данных, применяя изменения инкрементально и сохраняя существующие данные.

Основной рабочий процесс:

  1. Изменение модели: Вы редактируете классы сущностей или DbContext.
  2. Создание миграции: Выполняете команду, которая сравнивает текущую модель с предыдущим состоянием и генерирует код для применения изменений к БД.
    dotnet ef migrations add AddDescriptionToProduct
  3. Проверка и применение: Сгенерированный код миграции (файлы в папке Migrations/) можно отредактировать, а затем применить к базе данных.
    dotnet ef database update

Структура сгенерированной миграции:

public partial class AddDescriptionToProduct : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        // Код для применения изменений
        migrationBuilder.AddColumn<string>(
            name: "Description",
            table: "Products",
            type: "nvarchar(max)",
            nullable: true);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        // Код для отката изменений (противоположность Up)
        migrationBuilder.DropColumn(
            name: "Description",
            table: "Products");
    }
}

Практические рекомендации:

  • Именование: Давайте миграциям осмысленные имена, отражающие суть изменения (например, AddEmailToUser, CreateOrderTable).
  • Ручная правка: Сгенерированный код Up/Down можно и иногда нужно редактировать вручную для сложных операций (например, переноса данных, добавления индексов).
  • Продакшен: В рабочих средах миграции часто применяются как часть пайплайна CI/CD, а не вручную. Для этого используется команда ef через CLI или метод context.Database.Migrate() при старте приложения.
  • SQL-скрипты: Можно сгенерировать SQL-скрипт для ручного применения DBA:
    dotnet ef migrations script --output migration.sql
  • Подход Code-First: Миграции — это краеугольный камень подхода Code-First, когда структура БД определяется и управляется из кода приложения.