Přehled migrací

V reálných projektech se datové modely mění v závislosti na implementaci funkcí: jsou přidávány a odebírány nové entity nebo vlastnosti a je potřeba odpovídajícím způsobem měnit databázová schémata, aby byla synchronizovaná s aplikací. Funkce migrace v EF Core umožňuje postupně aktualizovat databázové schéma tak, aby bylo synchronizováno s datovým modelem aplikace, a přitom zachovat stávající data v databázi.

Obecně migrace fungují následujícím způsobem:

  • Když dojde ke změně datového modelu, vývojář pomocí nástrojů EF Core přidá odpovídající migraci popisující aktualizace nutné k zachování synchronizace databázového schématu. EF Core porovná aktuální model se snímkem starého modelu, zjistí rozdíly a vygeneruje zdrojové soubory migrace. Tyto soubory je možné ve správě zdrojového kódu projektu sledovat jako jakýkoli jiný zdrojový soubor.
  • Jakmile se vygeneruje nová migrace, dá se pro databázi použít různými způsoby. EF Core zaznamenává všechny použité migrace ve speciální tabulce historie, což umožňuje zjistit, které migrace se použily a které ne.

Zbytek této stránky je podrobný průvodce pro začátečníky věnovaný tomu, jak používat migrace. Podrobnější informace najdete na dalších stránkách v této části.

Začínáme

Předpokládejme, že jste právě dokončili první aplikaci EF Core, která obsahuje následující jednoduchý model:

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Je možné, že jste během vývoje k rychlé iteraci a změně modelu podle potřeby použili vytvoření a vyřazení rozhraní API, ale teď když vaše aplikace přechází do produkčního prostředí, potřebujete způsob, jak toto schéma bezpečně rozvíjet schéma bez vyřazení celé databáze.

Instalace nástrojů

Nejprve budete muset nainstalovat nástroje příkazového řádku EF Core:

Vytvoření první migrace

Teď jste připraveni přidat první migraci. Instruujte EF Core, aby se vytvořila migraci s názvem InitialCreate:

dotnet ef migrations add InitialCreate

EF Core vytvoří v projektu adresář s názvem Migrace a vygeneruje nějaké soubory. Je vhodné zkontrolovat, co přesně se vygenerovalo a případně to změnit, ale prozatím tuto fázi přeskočíme.

Vytvoření databáze a schématu

V tomto okamžiku můžete EF nechat vytvořit databázi a vytvořit schéma z migrace. To lze provést následujícím způsobem:

dotnet ef database update

A to je vše. Vaše aplikace je připravená ke spuštění s novou databází a nemuseli jste napsat ani jeden řádek SQL. Upozorňujeme, že tento způsob použití migrací je ideální pro místní vývoj, ale je méně vhodný pro produkční prostředí. Další informace najdete na stránce Aplikování migrací.

Vývoj modelu

Uplynulo několik dní a měli byste přidat časové razítko vytvoření vašich blogů. Provedli jste potřebné změny aplikace a váš model teď vypadá takto:

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedTimestamp { get; set; }
}

Váš model a produkční databáze teď nejsou synchronizované – musíme do schématu databáze přidat nový sloupec. Vytvořme pro tento účel novou migraci:

dotnet ef migrations add AddBlogCreatedTimestamp

Všimněte si, že migracím dáváme popisné názvy, abychom později usnadnili orientaci v historii projektu.

Protože se nejedná o první migraci projektu, EF Core teď porovná aktualizovaný model se snímkem starého modelu před přidáním sloupce. Snímek modelu je jedním ze souborů vygenerovaných platformou EF Core při přidání migrace a je vrácen se změnami do správy zdrojového kódu. Na základě uvedeného porovnání EF Core zjistí, že byl přidán sloupec, a přidá příslušnou migraci.

Migraci teď můžete použít jako předtím:

dotnet ef database update

Všimněte si, že EF tentokrát zjistí, že databáze už existuje. Kromě toho, když se aplikovala naše první migrace, byla tato skutečnost zaznamenána ve speciální tabulce historie migrací v databázi. To umožňuje EF automaticky použít jenom novou migraci.

Vyloučení částí modelu

Někdy můžete chtít odkazovat na typy z jiného DbContextu. Může to vést ke konfliktům migrace. Chcete-li tomu zabránit, vylučte tento typ z migrací jednoho z DbContextů.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<IdentityUser>()
        .ToTable("AspNetUsers", t => t.ExcludeFromMigrations());
}

Další kroky

Výše uvedený příklad byl jenom stručným úvodem k migracím. Další informace o správě migrací, jejich aplikaci a dalších aspektech najdete na dalších stránkách dokumentace. Referenční informace k nástrojům.NET Core CLI také obsahují užitečné informace o různých příkazech.

Další prostředky