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ů.
Do adresního řádku zadejte "cmd" a stiskněte Enter.
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." Najděte na hlavním panelu systému Windows ikonu SLUŽBY IIS Express a klikněte na ni pravým tlačítkem myši a potom klikněte na položku Zastavit web ContosoUniversity>.
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.cs
souboru . 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.
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 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.App
balíč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 Tools
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 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í.