Kurz: Část 5: Použití migrací na ukázku Univerzity Contoso

V tomto kurzu začnete používat funkci migrace EF Core pro správu změn datového modelu. V dalších kurzech přidáte při změně datového modelu další migrace.

V tomto kurzu jste:

  • Další informace o migracích
  • Vytvoření počáteční migrace
  • Prozkoumání metod nahoru a dolů
  • Další informace o snímku datového modelu
  • Použití migrace

Požadavky

Informace o migracích

Při vývoji nové aplikace se datový model často mění a pokaždé, když se model změní, přestane být synchronizovaný s databází. Tyto kurzy jste spustili konfigurací entity Framework pro vytvoření databáze, pokud neexistuje. Pokaždé, když změníte datový model – přidáte, odeberete nebo změníte třídy entit nebo změníte třídu DbContext – databázi a EF vytvoří nový model, který odpovídá modelu, a zasadí ho testovacími daty.

Tato metoda udržování databáze v synchronizaci s datovým modelem funguje dobře, dokud aplikaci nasadíte do produkčního prostředí. Když je aplikace spuštěná v produkčním prostředí, obvykle ukládá data, která chcete zachovat, a nechcete ztratit všechno pokaždé, když provedete změnu, například přidání nového sloupce. Funkce migrace EF Core řeší tento problém tím, že ef umožňuje aktualizovat schéma databáze místo vytvoření nové databáze.

K práci s migracemi můžete použít konzolu Správce balíčků (PMC) nebo rozhraní příkazového řádku. V těchto kurzech se dozvíte, jak používat příkazy rozhraní příkazového řádku. Informace o PMC jsou na konci tohoto kurzu.

Vypusťte databázi.

Nainstalujte nástroje EF Core jako globální nástroj a odstraňte databázi:

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

Následující část vysvětluje, jak spouštět příkazy rozhraní příkazového řádku.

Vytvoření počáteční migrace

Uložte změny a sestavte projekt. Pak otevřete příkazové okno a přejděte do složky projektu. Tady je rychlý způsob, jak to udělat:

  • V Průzkumníku řešení klikněte pravým tlačítkem myši na projekt a z místní nabídky zvolte Otevřít složku v Průzkumníku souborů .

    Open in File Explorer menu item

  • Do adresního řádku zadejte "cmd" a stiskněte Enter.

    Open command window

Do příkazového okna zadejte následující příkaz:

dotnet ef migrations add InitialCreate

V předchozích příkazech se zobrazí výstup podobný následujícímu:

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'

Pokud se zobrazí chybová zpráva "nelze získat přístup k souboru ... ContosoUniversity.dll, protože ho používá jiný proces", vyhledejte ikonu IIS Express v hlavním panelu systému Windows a klikněte na něj pravým tlačítkem myši a potom klikněte na web Stop ContosoUniversity>.

Prozkoumání metod nahoru a dolů

Po spuštění migrations add příkazu ef vygeneroval kód, který vytvoří databázi úplně od začátku. Tento kód je ve složce Migrace v souboru s názvem <timestamp>_InitialCreate.cs. Metoda Up třídy vytvoří databázové tabulky, které odpovídají sadám entit datového InitialCreate modelu, a Down metoda je odstraní, jak je znázorněno v následujícím příkladu.

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
    }
}

Migrace volá metodu Up pro implementaci změn datového modelu pro migraci. Když zadáte příkaz pro vrácení aktualizace zpět, migrace volá metodu Down .

Tento kód je určený pro počáteční migraci, kterou jste vytvořili při zadání migrations add InitialCreate příkazu. Parametr názvu migrace (v příkladu InitialCreate) se používá pro název souboru a může být jakýkoliv, co chcete. Nejlepší je zvolit slovo nebo frázi, která shrnuje, co se v migraci provádí. Můžete například pojmenovat pozdější migraci AddDepartmentTable.

Pokud jste vytvořili počáteční migraci, když databáze již existuje, vygeneruje se kód pro vytvoření databáze, ale nemusí se spouštět, protože databáze už odpovídá datovému modelu. Když nasadíte aplikaci do jiného prostředí, ve kterém databáze ještě neexistuje, spustí se tento kód pro vytvoření databáze, takže je vhodné ji nejprve otestovat. Proto jste databázi vyřadili dříve, aby migrace mohly vytvořit nový úplně od začátku.

Snímek datového modelu

Migrace vytvoří snímek aktuálního schématu databáze v Migrations/SchoolContextModelSnapshot.cs. Když přidáte migraci, ef určí, co se změnilo porovnáním datového modelu se souborem snímku.

Pomocí příkazu dotnet ef migrations odeberte migraci. dotnet ef migrations remove odstraní migraci a zajistí správné resetování snímku. Pokud dotnet ef migrations remove selže, použijte dotnet ef migrations remove -v k získání dalších informací o selhání.

Další informace o tom, jak se soubor snímků používá, najdete v tématu Migrace EF Core v týmových prostředích .

Použití migrace

V příkazovém okně zadejte následující příkaz, který v něm vytvoří databázi a tabulky.

dotnet ef database update

Výstup z příkazu je podobný migrations add příkazu, s výjimkou toho, že se zobrazí protokoly pro příkazy SQL, které nastavily databázi. Většina protokolů se v následujícím ukázkovém výstupu vynechá. Pokud nechcete zobrazit tuto úroveň podrobností ve zprávách protokolu, můžete změnit úroveň protokolu v appsettings.Development.json souboru. Další informace najdete v tématu Protokolování v .NET Core a 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.

Pomocí Průzkumníka objektů SQL Serveru můžete databázi zkontrolovat, jak jste to udělali v prvním kurzu. Všimněte si přidání tabulky __EFMigrationsHistory, která sleduje, které migrace byly použity pro databázi. Zobrazte data v této tabulce a zobrazí se jeden řádek pro první migraci. (Poslední protokol v předchozím příkladu výstupu rozhraní příkazového řádku ukazuje příkaz INSERT, který vytvoří tento řádek.)

Spusťte aplikaci, abyste ověřili, že všechno stále funguje stejně jako předtím.

Students Index page

Porovnání rozhraní příkazového řádku a PMC

Nástroje EF pro správu migrací jsou k dispozici z příkazů rozhraní příkazového řádku .NET Core nebo z rutin PowerShellu v okně konzoly Správce balíčků sady Visual Studio (PMC). V tomto kurzu se dozvíte, jak používat rozhraní příkazového řádku, ale pokud chcete, můžete použít PMC.

Příkazy EF pro příkazy PMC jsou v balíčku Microsoft.EntityFrameworkCore.Tools . Tento balíček je součástí metabalíku Microsoft.AspNetCore.App, takže není nutné přidat odkaz na balíček, pokud má vaše aplikace odkaz na Microsoft.AspNetCore.Appbalíček .

Důležité: Nejedná se o stejný balíček jako balíček, který pro rozhraní příkazového řádku nainstalujete úpravou .csproj souboru. Název tohoto typu končí Toolsna rozdíl od názvu balíčku rozhraní příkazového řádku, který končí Tools.DotNet.

Další informace o příkazech rozhraní příkazového řádku najdete v tématu .NET Core CLI.

Další informace o příkazech PMC najdete v tématu Konzola Správce balíčků (Visual Studio).

Získání kódu

Stáhněte nebo zobrazte dokončenou aplikaci.

Další krok

Přejděte k dalšímu kurzu a začněte se podívat na pokročilejší témata týkající se rozšíření datového modelu. Spolu s vytvářením a aplikováním dalších migrací.