Миграции баз данных в C# (.NET): Entity Framework, FluentMigrator и другие подходы

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Миграции баз данных в C# (.NET): Полное руководство

Управление изменениями схемы базы данных — критически важная задача при разработке любого приложения на C# (.NET). Миграции позволяют версионировать, отслеживать и автоматически применять изменения структуры БД (добавление таблиц, столбцов, индексов) синхронно с кодом приложения. В экосистеме .NET существует несколько зрелых инструментов для этой задачи. В этой статье мы подробно разберём три основных подхода: встроенный механизм Entity Framework Core, специализированные библиотеки FluentMigrator и DbUp.

1. Entity Framework Core Migrations (EF Core)

Наиболее популярный способ для проектов, уже использующих ORM Entity Framework Core. Миграции тесно интегрированы с вашей моделью данных (Code-First подход).

Установка и настройка

Для работы с миграциями вам понадобится установить пакет:

dotnet add package Microsoft.EntityFrameworkCore.Tools

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

После изменения ваших C#-моделей (например, добавления нового свойства Email в класс User) выполните в терминале:

dotnet ef migrations add AddEmailToUser
dotnet ef database update

Первая команда создаст файл миграции с автоматически сгенерированным кодом на C#. Вторая — применит его к вашей базе данных.

Пример кода миграции (сгенерированный файл):

public partial class AddEmailToUser : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AddColumn<string>(
            name: "Email",
            table: "Users",
            type: "nvarchar(200)",
            nullable: true);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropColumn(
            name: "Email",
            table: "Users");
    }
}

Метод Up применяет изменения, Down — откатывает их.

Преимущества и недостатки EF Core Migrations

  • Плюсы: Тесная интеграция с моделями, автоматическая генерация кода, поддержка откатов, встроенная в экосистему .NET.
  • Минусы: Привязка к EF Core, сложность при работе с нетривиальными изменениями (например, переименование столбцов), возможны проблемы с конфликтами в команде.

2. FluentMigrator

Это независимая, легковесная библиотека для миграций, не привязанная к конкретному ORM. Миграции пишутся вручную на C# с использованием fluent-интерфейса.

Установка

dotnet add package FluentMigrator

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

[Migration(202310010001)]
public class CreateUserTable : Migration
{
    public override void Up()
    {
        Create.Table("Users")
            .WithColumn("Id").AsInt32().PrimaryKey().Identity()
            .WithColumn("Name").AsString(100).NotNullable()
            .WithColumn("Email").AsString(200).Nullable();
        
        Create.Index("IX_Users_Email")
            .OnTable("Users")
            .OnColumn("Email");
    }

    public override void Down()
    {
        Delete.Table("Users");
    }
}

Запуск миграций

Для выполнения миграций используется runner. Пример конфигурации в Program.cs:

var serviceProvider = new ServiceCollection()
    .AddFluentMigratorCore()
    .ConfigureRunner(rb => rb
        .AddSqlServer()
        .WithGlobalConnectionString("YourConnectionString")
        .ScanIn(typeof(CreateUserTable).Assembly).For.Migrations())
    .BuildServiceProvider();

using var scope = serviceProvider.CreateScope();
var runner = scope.ServiceProvider.GetRequiredService<IMigrationRunner>();
runner.MigrateUp();

Преимущества FluentMigrator

  • Не зависит от ORM (можно использовать с Dapper, ADO.NET).
  • Чистый, читаемый C#-код.
  • Поддержка большинства СУБД (SQL Server, PostgreSQL, MySQL, SQLite).
  • Возможность писать сложные миграции с бизнес-логикой.

3. DbUp

Минималистичный инструмент, ориентированный на выполнение SQL-скриптов. Идеален для DBA и проектов, где полный контроль над SQL важен.

Установка

dotnet add package dbup-sqlserver

Пример использования

Создайте папку Scripts в проекте и поместите туда SQL-файлы (например, 001_CreateUsersTable.sql). Содержимое файла:

Рекомендаций