Миграции баз данных в 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). Содержимое файла:
Также в библиотеке
Charts для Swift: полное руководство с примерами
Машинное обучение на Go: обзор библиотек и фреймворков (Golang)
Авторизация и аутентификация в Kotlin: JWT, Spring Security и Ktor
Генерация PDF отчётов на Go: обзор библиотек и примеры кода
ORM для JavaScript (Node.js): сравнение Sequelize, TypeORM, Prisma