Migracje i zarządzanie schematem
Twórz, stosuj i wycofuj migracje, aby bezpiecznie rozwijać schemat bazy danych.
Migracje i zarządzanie schematem to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.
Czym są migracje EF Core
Migracje to generowane przez kod pliki opisujące przyrostowe zmiany schematu bazy danych. Zamiast ręcznie pisać kod SQL DDL, EF Core generuje go i automatycznie stosuje, utrzymując synchronizację kodu z bazą danych.
Instalowanie narzędzi EF Core
Narzędzie CLI EF Core (dotnet-ef) musi być zainstalowane globalnie lub jako narzędzie lokalne, aby można było uruchamiać polecenia migracji z terminala.
# 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.)Tworzenie pierwszej migracji
dotnet ef migrations add porównuje bieżący model z ostatnią migawką i generuje plik migracji zawierający metody Up() (zastosowanie) oraz Down() (wycofanie).
# 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 modelBudowa pliku migracji
Każda migracja zawiera metodę Up (stosującą zmiany) oraz metodę Down (wycofującą je). EF Core generuje je automatycznie na podstawie różnic między modelami.
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");
}
}Stosowanie migracji
dotnet ef database update stosuje wszystkie oczekujące migracje. EF Core śledzi, które migracje zostały już wykonane, w tabeli __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 InitialCreateProgramowe stosowanie migracji podczas uruchamiania
W środowisku produkcyjnym można programowo zastosować migracje podczas uruchamiania aplikacji, dzięki czemu baza danych będzie zawsze aktualna bez ręcznego wykonywania poleceń 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();Dodawanie kolumny w nowej migracji
Należy dodać właściwość do encji, a następnie utworzyć nową migrację. EF Core wykryje zmianę i wygeneruje operację 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);Inicjowanie danych w migracjach
Należy użyć HasData w metodzie OnModelCreating, aby zainicjować dane referencyjne. EF Core uwzględni je w metodzie Up migracji jako instrukcje 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 SeedCategoriesNiestandardowy SQL w migracjach
Gdy potrzebny jest kod DDL, którego EF Core nie potrafi wygenerować automatycznie (wyzwalacze, widoki, procedury składowane), należy użyć 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");
}Usuwanie migracji
Jeśli migracja nie została jeszcze zastosowana, można ją usunąć za pomocą dotnet ef migrations remove. W ten sposób można usunąć wyłącznie ostatnią migrację.
# 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.sqlPraktyczny przykład: strategia migracji CI/CD
W potoku CI/CD należy wygenerować skrypt migracji i przekazać go do weryfikacji administratorowi bazy danych przed zastosowaniem na produkcji — nigdy nie należy bezrefleksyjnie uruchamiać MigrateAsync() w krytycznych systemach produkcyjnych.
# 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.sqlSzybkie sprawdzenie
W której tabeli EF Core śledzi, które migracje zostały już zastosowane w bazie danych?
Podsumowanie: migracje i zarządzanie schematem
Najważniejsze informacje:
dotnet ef migrations add <Name>generuje pliki opisujące przyrostowe zmiany schematu- Każda migracja zawiera metody
Up()(zastosowanie) iDown()(wycofanie) dotnet ef database updatestosuje oczekujące migracje- Należy użyć
MigrateAsync()podczas uruchamiania aplikacji, aby zautomatyzować wdrożenia - W potokach produkcyjnych należy generować idempotentne skrypty SQL do weryfikacji przez administratora bazy danych
Często zadawane pytania
Czy lekcja „Migracje i zarządzanie schematem” jest bezpłatna?
Tak — pełny tekst „Migracje i zarządzanie schematem” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Migracje i zarządzanie schematem”?
Twórz, stosuj i wycofuj migracje, aby bezpiecznie rozwijać schemat bazy danych. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C# Academy?
Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Migracje i zarządzanie schematem”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?
Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy DbContext i DbSet
- Migracje i zarządzanie schematem
- Operacje CRUD z EF Core
- Relacje: jeden-do-wielu i wiele-do-wielu