Миграции баз данных в C# (.NET): Entity Framework Migrations

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

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

Начать курс

Миграции баз данных в 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 появится в таблице.

Откат миграции

Если нужно вернуться к предыдущей версии схемы, использу

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