Миграции и управление схемой
Создавайте, применяйте и откатывайте миграции, безопасно развивая схему базы данных.
«Миграции и управление схемой» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Основы DbContext и DbSet
- Миграции и управление схемой
- Операции CRUD с EF Core
- Связи: один-ко-многим и многие-ко-многим