C# Academy · Lektion

Migrationer og skemahåndtering

Opret, anvend og rul migrationer tilbage for at udvikle databaseskemaet sikkert.

Lektion 2 af 413 trin

Migrationer og skemahåndtering er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 4 lektioner i alt.

Hvad er EF Core-migreringer?

Migreringer er kodegenererede filer, der beskriver trinvise ændringer af databaseskemaet. I stedet for at skrive DDL-SQL i hånden genererer og anvender EF Core det automatisk, så kode og database holdes synkroniseret.

Installation af EF Core-værktøjer

EF Core CLI-værktøjet (dotnet-ef) skal installeres globalt (eller som et lokalt værktøj), så du kan køre migreringskommandoer fra terminalen.

# 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.)

Oprettelse af din første migrering

dotnet ef migrations add sammenligner din aktuelle model med det seneste modeløjebliksbillede og genererer en migreringsfil med metoderne Up() (anvend) og Down() (tilbagefør).

# 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

Indholdet af en migreringsfil

Hver migrering har en Up-metode (anvender ændringer) og en Down-metode (tilbagefører dem). EF Core genererer disse automatisk ud fra forskelle i modellen.

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");
    }
}

Anvendelse af migreringer

dotnet ef database update anvender alle ventende migreringer. EF Core holder styr på, hvilke migreringer der er kørt, i tabellen __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

Programmatisk migrering ved opstart

I produktion kan du anvende migreringer programmatisk ved opstart, så databasen altid er opdateret uden manuelle CLI-trin.

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();

Tilføjelse af en kolonne i en ny migrering

Føj en egenskab til din entitet, og opret derefter en ny migrering. EF Core registrerer ændringen og genererer en AddColumn-handling.

// 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);

Datainitialisering i migreringer

Brug HasData i OnModelCreating til at indsætte referencedata. EF Core inkluderer dem i migreringens Up som INSERT-sætninger.

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

Brugerdefineret SQL i migreringer

Når du har brug for DDL, som EF Core ikke kan generere automatisk (triggere, visninger eller lagrede procedurer), skal du bruge 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");
}

Fjernelse af en migrering

Hvis du endnu ikke har anvendt en migrering, kan du slette den med dotnet ef migrations remove. Kun den seneste migrering kan fjernes på denne måde.

# 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

Praktisk eksempel: strategi for CI/CD-migrering

I en CI/CD-proces skal du generere et migreringsskript og lade en databaseadministrator gennemgå det, før det anvendes i produktion — kør aldrig MigrateAsync() ukritisk i kritiske produktionssystemer.

# 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

Hurtig kontrol

Hvilken EF Core-tabel registrerer, hvilke migreringer der allerede er anvendt på en database?

Opsamling: migreringer og skemastyring

Vigtigste pointer:

  • dotnet ef migrations add <Name> genererer filer med trinvise ændringer af skemaet
  • Hver migrering har metoderne Up() (anvendelse) og Down() (tilbageførsel)
  • dotnet ef database update anvender ventende migreringer
  • Brug MigrateAsync() ved appens opstart til automatiserede udrulninger
  • Generér idempotente SQL-skripter, som databaseadministratorer kan gennemgå i produktionsprocesser
Gratis at komme i gang

Lær C# med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
93
Lektioner
346

Ofte stillede spørgsmål

Er lektionen “Migrationer og skemahåndtering” gratis?

Ja — hele teksten til “Migrationer og skemahåndtering” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Migrationer og skemahåndtering”?

Opret, anvend og rul migrationer tilbage for at udvikle databaseskemaet sikkert. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C# Academy?

Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Migrationer og skemahåndtering”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C# Academy-lektion?

Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Grundlæggende om DbContext og DbSet
  2. Migrationer og skemahåndtering
  3. CRUD-operationer med EF Core
  4. Relationer: One-to-Many og Many-to-Many
← Tilbage til C# Academy