Dela via


Självstudie: Del 5, tillämpa migreringar på Contoso University-exemplet

I den här självstudien EF Core börjar du använda migreringsfunktionen för att hantera datamodelländringar. I senare självstudier lägger du till fler migreringar när du ändrar datamodellen.

I den här handledningen kommer du att:

  • Lär dig mer om migreringar
  • Skapa en inledande migrering
  • Undersöka upp- och ned-metoder
  • Lär dig mer om ögonblicksbilden av datamodellen
  • Tillämpa migreringen

Prerequisites

About migrations

När du utvecklar en ny applikation förändras din datamodell ofta, och varje gång modellen förändras tappar den synkroniseringen med databasen. Du har startat de här självstudierna genom att konfigurera Entity Framework för att skapa databasen om den inte finns. Varje gång du ändrar datamodellen – lägg till, ta bort eller ändra entitetsklasser eller ändra din DbContext-klass – kan du sedan ta bort databasen och EF skapar en ny som matchar modellen och skapar den med testdata.

Den här metoden för att hålla databasen synkroniserad med datamodellen fungerar bra tills du distribuerar programmet till produktion. När programmet körs i produktion lagrar det vanligtvis data som du vill behålla och du vill inte förlora allt varje gång du gör en ändring, till exempel genom att lägga till en ny kolumn. Migreringsfunktionen EF Core löser det här problemet genom att göra det möjligt för EF att uppdatera databasschemat i stället för att skapa en ny databas.

Om du vill arbeta med migreringar kan du använda Package Manager Console (PMC) eller CLI. De här självstudierna visar hur du använder CLI-kommandon. Information om PMC finns i slutet av den här självstudien.

Ta bort databasen

Installera EF Core verktyg som ett globalt verktyg och ta bort databasen:

dotnet tool install --global dotnet-ef
dotnet ef database drop

Note

Som standard representerar arkitekturen för de .NET-binärfiler som ska installeras den operativsystemarkitektur som körs. Information om hur du anger en annan OPERATIVSYSTEM-arkitektur finns i dotnet tool install, --arch option. Mer information finns i GitHub issue dotnet/AspNetCore.Docs #29262.

I följande avsnitt beskrivs hur du kör CLI-kommandon.

Skapa en inledande migrering

Spara ändringarna och skapa projektet. Öppna sedan ett kommandofönster och gå till projektmappen. Här är ett snabbt sätt att göra det:

  • Högerklicka på projektet i Solution Explorer och välj Öppna mapp i Utforskaren på snabbmenyn.

    Öppna i Menyalternativet Utforskaren

  • Ange "cmd" i adressfältet och tryck på Retur.

    Öppna kommandofönstret

Ange följande kommando i kommandofönstret:

dotnet ef migrations add InitialCreate

I föregående kommandon visas utdata som liknar följande:

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Done. To undo this action, use 'ef migrations remove'

Om du ser ett felmeddelande om att det inte går att komma åt filen ... ContosoUniversity.dll eftersom den används av en annan process.", hittar du IIS Express-ikonen i Windows System Tray och högerklickar på den och klickar sedan på ContosoUniversity > Stop Site.

Undersöka upp- och ned-metoder

När du körde migrations add kommandot genererade EF koden som ska skapa databasen från grunden. Den här koden finns i mappen Migrations i filen med namnet <timestamp>_InitialCreate.cs. Metoden Up för InitialCreate klassen skapar de databastabeller som motsvarar datamodellens entitetsuppsättningar och Down metoden tar bort dem, som du ser i följande exempel.

public partial class InitialCreate : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Course",
            columns: table => new
            {
                CourseID = table.Column<int>(nullable: false),
                Credits = table.Column<int>(nullable: false),
                Title = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Course", x => x.CourseID);
            });

        // Additional code not shown
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Enrollment");
        // Additional code not shown
    }
}

Migrationer använder metoden Up för att implementera datamodelländringarna för en migrering. När du anger ett kommando för att återställa uppdateringen anropar Migreringar metoden Down.

Den här koden är för den första migreringen som skapades när du angav migrations add InitialCreate kommandot. Parametern för migreringsnamn ("InitialCreate" i exemplet) används för filnamnet och kan vara vad du vill. Det är bäst att välja ett ord eller en fras som sammanfattar vad som görs i migreringen. Du kan till exempel ge en senare migrering namnet "AddDepartmentTable".

Om du skapade den första migreringen när databasen redan finns genereras koden för att skapa databasen, men den behöver inte köras eftersom databasen redan matchar datamodellen. När du distribuerar appen till en annan miljö där databasen inte finns ännu körs den här koden för att skapa databasen, så det är en bra idé att testa den först. Därför släppte du databasen tidigare – så att migreringar kan skapa en ny från grunden.

Ögonblicksbild av datamodell

Migreringar skapar en ögonblicksbild av det aktuella databasschemat i Migrations/SchoolContextModelSnapshot.cs. När du lägger till en migrering avgör EF vad som har ändrats genom att jämföra datamodellen med ögonblicksbildfilen.

Använd kommandot dotnet ef migrations remove för att ta bort en migrering. dotnet ef migrations remove tar bort migreringen och ser till att ögonblicksbilden återställs korrekt. Om dotnet ef migrations remove misslyckas kan du använda dotnet ef migrations remove -v för att hämta mer information om felet.

Mer information om hur ögonblicksbildsfilen används finns i Migreringar i teammiljöer.EF Core

Tillämpa migreringen

I kommandofönstret anger du följande kommando för att skapa databasen och tabellerna i den.

dotnet ef database update

Utdata från kommandot liknar migrations add kommandot, förutom att du ser loggar för DE SQL-kommandon som konfigurerar databasen. De flesta loggarna utelämnas i följande exempelutdata. Om du föredrar att inte se den här detaljnivån i loggmeddelanden kan du ändra loggnivån i appsettings.Development.json filen. Mer information finns i Loggning i .NET och ASP.NET Core.

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (274ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
      CREATE DATABASE [ContosoUniversity2];
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (60ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
      IF SERVERPROPERTY('EngineEdition') <> 5
      BEGIN
          ALTER DATABASE [ContosoUniversity2] SET READ_COMMITTED_SNAPSHOT ON;
      END;
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (15ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      CREATE TABLE [__EFMigrationsHistory] (
          [MigrationId] nvarchar(150) NOT NULL,
          [ProductVersion] nvarchar(32) NOT NULL,
          CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
      );

<logs omitted for brevity>

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
      VALUES (N'20190327172701_InitialCreate', N'5.0-rtm');
Done.

Använd SQL Server Object Explorer för att inspektera databasen som du gjorde i den första självstudien. Du ser tillägget av en __EFMigrationsHistory tabell som håller reda på vilka migreringar som har tillämpats på databasen. Visa data i tabellen så visas en rad för den första migreringen. (Den sista loggen i föregående CLI-utdataexempel visar INSERT-instruktionen som skapar den här raden.)

Kör programmet för att kontrollera att allt fortfarande fungerar på samma sätt som tidigare.

Elevindexsidan

Jämför CLI och PMC

EF-verktygen för att hantera migreringar är tillgängliga från .NET CLI-kommandon eller från PowerShell-cmdletar i fönstret Visual Studio Package Manager Console (PMC). Den här självstudien visar hur du använder CLI, men du kan använda PMC om du vill.

EF-kommandona för PMC-kommandona finns i paketet Microsoft.EntityFrameworkCore.Tools . Det här paketet ingår i Microsoft.AspNetCore.App metapackage, så du behöver inte lägga till en paketreferens om din app har en paketreferens för Microsoft.AspNetCore.App.

Viktig: Det här är inte samma paket som det du installerar för CLI genom att redigera .csproj filen. Namnet på den här slutar i Tools, till skillnad från CLI-paketnamnet som slutar i Tools.DotNet.

Mer information om CLI-kommandona finns i .NET CLI.

Mer information om PMC-kommandona finns i Package Manager Console (Visual Studio).

Hämta koden

Ladda ned eller visa den slutförda ansökan.

Next step

Gå vidare till nästa självstudie för att börja titta på mer avancerade ämnen om hur du expanderar datamodellen. Längs vägen skapar och tillämpar du ytterligare migreringar.