Kurz: Část 5: Použití migrací na ukázku z Contoso University
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 váš datový model často mění a pokaždé, když se model změní, se s databází nesynchronní. Tyto kurzy jste zahájili konfigurací Entity Framework pro vytvoření databáze, pokud ještě 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ý, který odpovídá modelu, a přidá do něj testovací data.
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 přijít o všechno pokaždé, když provádíte změnu, například přidání nového sloupce. Funkce EF Core migrations tento problém řeší tím, že umožňuje systému souborů EF aktualizovat schéma databáze místo vytvář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. Tyto kurzy ukazují, jak používat příkazy rozhraní příkazového řádku. Informace o PMC najdete na konci tohoto kurzu.
Vypustit databázi
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
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 Průzkumník souborů otevřít složku v místní nabídce.

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

V příkazovém okně 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 " Na hlavním panelu systému ContosoUniversity.dll se zobrazuje chybová zpráva ... ContosoUniversity.dll protože ho používá jiný proces.", vyhledejte ikonu IIS Express na hlavním panelu systému Windows, klikněte na něj pravým tlačítkem a pak klikněte na ContosoUniversity > Stop Site.
Prozkoumání metod Nahoru a Dolů
Při spuštění příkazu migrations add ef vygeneroval kód, který vytvoří databázi od začátku. Tento kód je ve složce Migrations v souboru s názvem <timestamp> _InitialCreate.cs. Metoda třídy vytvoří databázové tabulky, které odpovídají sadám entit datového modelu, a metoda je odstraní, jak je znázorněno Up InitialCreate v následujícím Down 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á Up metodu pro implementaci změn datového modelu pro migraci. Když zadáte příkaz pro vrácení aktualizace zpět, volá migrations Down metodu .
Tento kód je pro počáteční migraci, která byla vytvořena 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. Nejlepší je zvolit slovo nebo frázi, která shrnuje, co se při migraci provádí. Můžete například později migrací nazýt "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 spustit, protože databáze už odpovídá datovému modelu. Když aplikaci nasadíte do jiného prostředí, ve kterém databáze ještě neexistuje, spustí se tento kód k vytvoření databáze, takže je vhodné ji nejprve otestovat. To je důvod, proč jste databázi vyřazeni dříve – aby migrace vytvořily novou od začátku.
Snímek datového modelu
Migrace vytvoří snímek schématu aktuální databáze v souboru Migrations/SchoolContextModelSnapshot.cs. 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 remove. dotnet ef migrations remove odstraní migraci a zajistí správné resetování snímku. Pokud dotnet ef migrations remove selže, pomocí dotnet ef migrations remove -v získáte další informace o selhání.
Další EF Core o použití souboru snímku najdete v tématu Migrace snímků 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 se podobá příkazu s tím rozdílem, že se zobrazí protokoly pro migrations add SQL, které nastaví databázi. Většina protokolů je v následujícím ukázkovém výstupu vynechána. Pokud nechcete tuto úroveň podrobností ve zprávách protokolu zobrazit, můžete změnit úroveň protokolu vappsettings.Development.js souboru. Další informace naleznete 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í SQL Server Průzkumník objektů můžete zkontrolovat databázi stejně jako v prvním kurzu. Všimněte si přidání tabulky _ EFMigrationsHistory, která uchovává informace o tom, které migrace byly v _ databázi použity. Zobrazte 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 stále funguje stejně jako předtím.

Porovnání CLI a PMC
Nástroje EF pro správu migrací jsou k dispozici z .NET Core CLI příkazů nebo z rutin PowerShellu v okně Visual Studio Správce balíčků Console (PMC). Tento kurz ukazuje, 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í balíčku Microsoft.AspNetCore.App,takže pokud vaše aplikace obsahuje odkaz na balíček pro , nemusíte přidávat odkaz na Microsoft.AspNetCore.App balíček.
Důležité: Tento balíček není stejný jako balíček, který instalujete pro rozhraní příkazového řádku úpravou souboru .csproj. Název končí na , na rozdíl od názvu balíčku rozhraní příkazového řádku, Tools který končí na Tools.DotNet .
Další informace o příkazech rozhraní příkazového řádku najdete v .NET Core CLI.
Další informace o příkazech PMC najdete v tématu Správce balíčků Console (Visual Studio).
Získání kódu
Stáhněte nebo zobrazte dokončenou aplikaci.
Další krok
V dalším kurzu se můžete začít seznamovat s pokročilejšími tématy týkajícími se rozšíření datového modelu. Zároveň vytvoříte a použijete další migrace.