0Pricing
C# Academy · Lekcja

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 model

Budowa 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 InitialCreate

Programowe 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 SeedCategories

Niestandardowy 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.sql

Praktyczny 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.sql

Szybkie 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) i Down() (wycofanie)
  • dotnet ef database update stosuje 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

  1. Podstawy DbContext i DbSet
  2. Migracje i zarządzanie schematem
  3. Operacje CRUD z EF Core
  4. Relacje: jeden-do-wielu i wiele-do-wielu
← Powrót do C# Academy