Sdílet prostřednictvím


Přizpůsobení tabulky historie migrací

Poznámka

Pouze EF6 a novější – Funkce, rozhraní API atd. popsané na této stránce byly představeny v Entity Framework 6. Pokud používáte starší verzi, některé nebo všechny informace nemusí být platné.

Poznámka

Tento článek předpokládá, že víte, jak používat Migrace Code First v základních scénářích. Pokud ne, budete si muset před pokračováním přečíst Migrace Code First.

Co je tabulka historie migrací?

Tabulka historie migrací je tabulka používaná Migrace Code First k ukládání podrobností o migracích použitých v databázi. Ve výchozím nastavení je název tabulky v databázi __MigrationHistory a vytvoří se při použití první migrace do databáze. V entity Framework 5 byla tato tabulka systémovou tabulkou, pokud aplikace používala databázi Microsoft Sql Serveru. To se ale změnilo v sadě Entity Framework 6 a tabulka historie migrací už není označená systémovou tabulkou.

Proč přizpůsobit tabulku historie migrací?

Tabulka historie migrací by měla být použita výhradně Migrace Code First a změna ručně může přerušit migraci. Někdy ale výchozí konfigurace není vhodná a tabulka se musí přizpůsobit, například:

  • Potřebujete změnit jména nebo omezující vlastnosti sloupců, abyste povolili poskytovatele migrace 3rd party.
  • Chcete změnit název tabulky.
  • Pro tabulku __MigrationHistory musíte použít jiné než výchozí schéma.
  • Potřebujete uložit další data pro danou verzi kontextu, a proto musíte do tabulky přidat další sloupec.

Slova preventivních opatření

Změna tabulky historie migrace je výkonná, ale musíte být opatrní, abyste ji nepřekonáli. Modul runtime EF v současné době nekontroluje, jestli je přizpůsobená tabulka historie migrací kompatibilní s modulem runtime. Pokud aplikace není, může se za běhu přerušit nebo se chovat nepředvídatelně. To je ještě důležitější, pokud použijete více kontextů na databázi, v takovém případě může více kontextů použít stejnou tabulku historie migrace k ukládání informací o migracích.

Jak přizpůsobit tabulku historie migrací?

Než začnete, potřebujete vědět, že tabulku historie migrací můžete přizpůsobit pouze před použitím první migrace. Teď do kódu.

Nejprve budete muset vytvořit třídu odvozenou ze Třídy System.Data.Entity.Migrations.History.HistoryContext. Třída HistoryContext je odvozena z DbContext třídy, takže konfigurace tabulky historie migrací je velmi podobná konfiguraci modelů EF s fluent API. Stačí přepsat metodu OnModelCreating a pomocí rozhraní API fluent nakonfigurovat tabulku.

Poznámka

Obvykle když konfigurujete modely EF, nemusíte volat základ. OnModelCreating() z přepsání OnModelCreating metoda, protože DbContext.OnModelCreating() má prázdný text. To není případ konfigurace tabulky historie migrací. V tomto případě je první věc, kterou je potřeba udělat v přepsání OnModelCreating() skutečně zavolat základ. OnModelCreating(). Tím nakonfigurujete tabulku historie migrací výchozím způsobem, který pak upravíte metodou přepsání.

Řekněme, že chcete přejmenovat tabulku historie migrací a umístit ji do vlastního schématu s názvem "admin". Kromě toho byste chtěli přejmenovat sloupec MigrationId na Migration_ID.  Toho můžete dosáhnout vytvořením následující třídy odvozené z HistoryContext:

    using System.Data.Common;
    using System.Data.Entity;
    using System.Data.Entity.Migrations.History;

    namespace CustomizableMigrationsHistoryTableSample
    {
        public class MyHistoryContext : HistoryContext
        {
            public MyHistoryContext(DbConnection dbConnection, string defaultSchema)
                : base(dbConnection, defaultSchema)
            {
            }

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);
                modelBuilder.Entity<HistoryRow>().ToTable(tableName: "MigrationHistory", schemaName: "admin");
                modelBuilder.Entity<HistoryRow>().Property(p => p.MigrationId).HasColumnName("Migration_ID");
            }
        }
    }

Jakmile bude váš vlastní HistoryContext připravený, budete o něm muset ef vědět tak, že ho zaregistrujete prostřednictvím konfigurace založené na kódu:

    using System.Data.Entity;

    namespace CustomizableMigrationsHistoryTableSample
    {
        public class ModelConfiguration : DbConfiguration
        {
            public ModelConfiguration()
            {
                this.SetHistoryContext("System.Data.SqlClient",
                    (connection, defaultSchema) => new MyHistoryContext(connection, defaultSchema));
            }
        }
    }

To je v podstatě všechno. Teď můžete přejít na konzolu Správce balíčků, povolit migrace, přidat migraci a nakonec aktualizovat databázi. Výsledkem by mělo být přidání do databáze tabulka historie migrací nakonfigurovaná podle podrobností, které jste zadali v odvozené třídě HistoryContext.

Migrations History Table