C# Academy · Урок

Миграции и управление схемой

Создавайте, применяйте и откатывайте миграции, безопасно развивая схему базы данных.

Урок 2 из 413 шагов

«Миграции и управление схемой» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

Что такое миграции EF Core

Миграции — это сгенерированные кодом файлы, описывающие последовательные изменения схемы базы данных. Вместо ручного написания DDL SQL EF Core автоматически генерирует и применяет его, поддерживая синхронность кода и базы данных.

Установка инструментов EF Core

Инструмент CLI для EF Core (dotnet-ef) необходимо установить глобально или как локальный инструмент, чтобы выполнять команды миграции из терминала.

# Install globally
dotnet tool install --global dotnet-ef

# Verify
dotnet ef --version

# Required NuGet packages in your project:
# Microsoft.EntityFrameworkCore.Design
# Microsoft.EntityFrameworkCore.SqlServer (or Sqlite, etc.)

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

dotnet ef migrations add сравнивает текущую модель с последним снимком и создаёт файл миграции с методами Up() для применения изменений и Down() для отката.

# Create initial migration
dotnet ef migrations add InitialCreate

# Output files created:
# Migrations/20240101_InitialCreate.cs       <- Up/Down
# Migrations/20240101_InitialCreate.Designer.cs
# Migrations/AppDbContextModelSnapshot.cs   <- current model

Внутри файла миграции

Каждая миграция содержит метод Up, применяющий изменения, и метод Down, отменяющий их. EF Core автоматически генерирует эти методы на основе различий между моделями.

public partial class InitialCreate : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Products",
            columns: table => new
            {
                Id    = table.Column<int>(nullable: false)
                             .Annotation("SqlServer:Identity", "1, 1"),
                Name  = table.Column<string>(maxLength: 200, nullable: false),
                Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
            },
            constraints: table => table.PrimaryKey("PK_Products", x => x.Id));
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(name: "Products");
    }
}

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

dotnet ef database update применяет все ожидающие миграции. EF Core отслеживает уже выполненные миграции в таблице __EFMigrationsHistory.

# Apply all pending migrations
dotnet ef database update

# Apply up to a specific migration
dotnet ef database update AddProductIndex

# Roll back to a previous migration
dotnet ef database update InitialCreate

Программное применение миграций при запуске

В рабочей среде можно программно применять миграции при запуске, чтобы база данных всегда была актуальной без ручного выполнения команд CLI.

var app = builder.Build();

// Apply pending migrations at startup
using (var scope = app.Services.CreateScope())
{
    var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
    await db.Database.MigrateAsync();
}

app.Run();

Добавление столбца в новой миграции

Добавьте свойство в сущность, а затем создайте новую миграцию. EF Core обнаружит изменение и сгенерирует операцию AddColumn.

// 1. Add property to entity
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; } = "";
    public decimal Price { get; set; }
    public string? Description { get; set; } // NEW
}

// 2. Generate migration
// dotnet ef migrations add AddProductDescription

// Generated Up():
migrationBuilder.AddColumn<string>(
    name: "Description",
    table: "Products",
    nullable: true);

Заполнение данных в миграциях

Используйте HasData в OnModelCreating, чтобы добавить справочные данные. EF Core включит их в Up миграции в виде операторов INSERT.

modelBuilder.Entity<Category>().HasData(
    new Category { Id = 1, Name = "Electronics" },
    new Category { Id = 2, Name = "Books" },
    new Category { Id = 3, Name = "Clothing" }
);

// Then regenerate the migration:
// dotnet ef migrations add SeedCategories

Пользовательский SQL в миграциях

Если требуется DDL, который EF Core не может сгенерировать автоматически, например триггеры, представления или хранимые процедуры, используйте migrationBuilder.Sql().

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.Sql(@"
        CREATE VIEW vw_ActiveProducts AS
        SELECT Id, Name, Price
        FROM Products
        WHERE IsActive = 1
    ");
}

protected override void Down(MigrationBuilder migrationBuilder)
{
    migrationBuilder.Sql("DROP VIEW vw_ActiveProducts");
}

Удаление миграции

Если миграция ещё не была применена, её можно удалить с помощью dotnet ef migrations remove. Таким способом можно удалить только последнюю миграцию.

# Remove the last unapplied migration
dotnet ef migrations remove

# List all migrations and their status
dotnet ef migrations list

# Script all migrations to SQL (for DBA review)
dotnet ef migrations script --output deploy.sql

Практика: стратегия миграций CI/CD

В конвейере CI/CD сгенерируйте скрипт миграции и перед применением в рабочей среде передайте его на проверку DBA — никогда не запускайте MigrateAsync() вслепую в критически важных рабочих системах.

# Generate idempotent script for all pending migrations
dotnet ef migrations script --idempotent --output migrations.sql

# Review migrations.sql, then apply via sqlcmd / psql:
# sqlcmd -S server -d db -i migrations.sql

Быстрая проверка

Какая таблица EF Core отслеживает, какие миграции уже были применены к базе данных?

Итоги: миграции и управление схемой

Главное:

  • dotnet ef migrations add <Name> генерирует файлы с последовательными изменениями схемы
  • Каждая миграция содержит методы Up() для применения и Down() для отката изменений
  • dotnet ef database update применяет ожидающие миграции
  • Используйте MigrateAsync() при запуске приложения для автоматического развёртывания
  • В рабочих конвейерах генерируйте идемпотентные SQL-скрипты для проверки DBA
Можно начать бесплатно

Изучай C# с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
93
Уроки
346

Часто задаваемые вопросы

Урок «Миграции и управление схемой» бесплатный?

Да — полный текст урока «Миграции и управление схемой» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Миграции и управление схемой»?

Создавайте, применяйте и откатывайте миграции, безопасно развивая схему базы данных. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Миграции и управление схемой»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы DbContext и DbSet
  2. Миграции и управление схемой
  3. Операции CRUD с EF Core
  4. Связи: один-ко-многим и многие-ко-многим
← Назад к C# Academy