Kurz: Část 5– použití migrací na ukázku Contoso University

V tomto kurzu začnete používat EF Core funkci migrace 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 se naučíte:

  • 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 se synchronizovat 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, můžete databázi odstranit a EF vytvoří nový model, který odpovídá modelu, a zasadí ho testovacími daty.

Tato metoda synchronizace databáze s datovým modelem funguje dobře, dokud aplikaci nenasadí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 při každé změně, jako je přidání nového sloupce. Funkce EF Core Migrace tento problém řeší 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.

Vyřazení databáze

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

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

Poznámka

Ve výchozím nastavení architektura binárních souborů .NET, které se mají nainstalovat, představuje aktuálně spuštěnou architekturu operačního systému. Pokud chcete zadat jinou architekturu operačního systému, přečtěte si téma instalace nástroje dotnet, možnost --arch. Další informace najdete v tématu o problému GitHubu dotnet/AspNetCore.Docs #29262.

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ík řešení klikněte pravým tlačítkem na projekt a v místní nabídce zvolte Otevřít složku v Průzkumník 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 ji používá jiný proces.", vyhledejte na hlavním panelu systému Windows ikonu IIS Express a klikněte na ni pravým tlačítkem myši a potom klikněte na položku ContosoUniversity > Stop Site.

Prozkoumání metod Nahoru a Dolů

Po spuštění migrations add příkazu ef vygeneroval kód, který vytvoří databázi od nuly. Tento kód je ve složce Migrations v souboru s názvem <timestamp>_InitialCreate.cs. Up Metoda InitialCreate třídy vytvoří databázové tabulky, které odpovídají sadám entit datového 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 vytvořenou migrations add InitialCreate při zadání příkazu. Parametr názvu migrace (v příkladu InitialCreate) se používá pro název souboru a může být jakýkoliv. Nejlepší je zvolit slovo nebo frázi, které shrnuje, co se provádí v migraci. Můžete například pojmenovat pozdější migraci AddDepartmentTable.

Pokud jste vytvořili počáteční migraci, když už databáze 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 a vytvoří databázi, takže je vhodné ji nejprve otestovat. Proto jste databázi zrušili dříve – aby migrace mohly vytvořit novou databázi úplně od začátku.

Snímek datového modelu

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

K odebrání migrace použijte příkaz dotnet ef migrations. dotnet ef migrations remove odstraní migraci a zajistí, že se snímek správně resetuje. 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ímku používá, najdete v tématu EF Core Migrace v týmových prostředích .

Použití migrace

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

dotnet ef database update

Výstup příkazu je podobný migrations add příkazu s tím rozdílem, že se zobrazí protokoly pro příkazy SQL, které nastavily databázi. Většina protokolů se vynechá v následujícím ukázkovém výstupu. Pokud nechcete, aby se tato úroveň podrobností zobrazovala ve zprávách protokolu, můžete změnit úroveň protokolu v appsettings.Development.json souboru. Další informace najdete v článku o 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.

Sql Server Průzkumník objektů můžete použít ke kontrole databáze, jak jste to udělali v prvním kurzu. Všimněte si přidání tabulky __EFMigrationsHistory, která sleduje, které migrace se u databáze použily. Prohlédněte si data v této tabulce a uvidíte 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 a ověřte, že všechno 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 v příkazech rozhraní příkazového řádku .NET Core nebo v rutinách 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 pokud má vaše aplikace odkaz na Microsoft.AspNetCore.Appbalíček, nemusíte přidávat odkaz na balíček .

Důležité: Tento balíček není stejný jako balíček, který nainstalujete pro rozhraní příkazového řádku úpravou .csproj souboru. Název tohoto balíčku končí na Toolsrozdí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 Správce balíčků příkazch

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 zabývat pokročilejšími tématy o rozšíření datového modelu. Společně s vytvářením a aplikováním dalších migrací.