Миграции баз данных в C# (.NET) с Entity Framework
При разработке приложений на C# (.NET) одной из ключевых задач является синхронизация модели данных (классов C#) и схемы базы данных. Ручное изменение таблиц, столбцов и связей — трудоемкий и чреватый ошибками процесс. Решение этой проблемы — миграции баз данных, встроенный механизм Entity Framework (EF) Core или Entity Framework 6. Миграции позволяют автоматически применять изменения к структуре БД на основе изменений в коде, сохраняя при этом существующие данные.
Что такое миграции и зачем они нужны?
Миграция — это набор инструкций (код на C#), описывающих, как изменить схему базы данных с одной версии на другую. Вместо того чтобы писать SQL-скрипты вручную, разработчик изменяет C#-модели (например, добавляет новое свойство в класс), а EF генерирует файл миграции. Затем этот файл применяется к базе данных.
- Автоматизация: Исключает ручное написание SQL.
- Версионирование: Каждая миграция — это отдельный файл с меткой времени, что позволяет откатывать изменения.
- Безопасность данных: При добавлении столбца EF не удаляет существующие строки (если не задано иное).
- Совместная работа: Все члены команды применяют одни и те же миграции, что исключает расхождение схем.
Подготовка проекта
Для работы с миграциями необходим установленный пакет Microsoft.EntityFrameworkCore.Tools (для EF Core) или EntityFramework (для EF6). Установка через NuGet:
// Для EF Core (через Package Manager Console)
Install-Package Microsoft.EntityFrameworkCore.Tools
// Или через .NET CLI
dotnet add package Microsoft.EntityFrameworkCore.Tools
Также потребуется контекст базы данных, унаследованный от DbContext. Пример простой модели:
public class Blog
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
}
public class AppDbContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=MyBlogDb;Trusted_Connection=True;");
}
}
Создание первой миграции
Откройте Package Manager Console (в Visual Studio: View -> Other Windows -> Package Manager Console) или используйте .NET CLI. Выполните команду:
// Через PMC
Add-Migration InitialCreate
// Или через CLI
dotnet ef migrations add InitialCreate
После выполнения в проекте появится папка Migrations с двумя файлами:
XXXXXXXXXXXXXX_InitialCreate.cs— класс миграции с методамиUp()(что изменить) иDown()(как откатить).AppDbContextModelSnapshot.cs— слепок текущей модели.
Применение миграции к базе данных
Чтобы создать или обновить БД до последней версии, выполните:
// Через PMC
Update-Database
// Через CLI
dotnet ef database update
EF выполнит все непримененные миграции по порядку. Если база данных не существует, она будет создана автоматически.
Добавление нового поля и создание миграции
Предположим, мы решили добавить в модель Blog свойство CreatedAt:
public class Blog
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public DateTime CreatedAt { get; set; } // новое поле
}
Теперь создаем новую миграцию:
Add-Migration AddCreatedAtField
В сгенерированном файле вы увидите:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<DateTime>(
name: "CreatedAt",
table: "Blogs",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "CreatedAt",
table: "Blogs");
}
Примените миграцию командой Update-Database. Поле CreatedAt появится в таблице.
Откат миграции
Если нужно вернуться к предыдущей версии схемы, использу
Также в библиотеке
Работа с XML в JavaScript (Node.js): парсинг, создание и валидация
Обработка Markdown на Rust: библиотеки, парсеры и инструменты
Генерация QR-кодов на Java: библиотека ZXing (подробное руководство)
Swashbuckle для C# (.NET): полное руководство с примерами
Логирование для Kotlin: лучшие решения и библиотеки