Dostosowywanie tabeli historii migracji

Uwaga

Tylko rozwiązanie EF6 i nowsze wersje — Funkcje, interfejsy API itp. omówione na tej stronie zostały wprowadzone w rozwiązaniu Entity Framework 6. Jeśli korzystasz ze starszej wersji, niektóre lub wszystkie podane informacje nie mają zastosowania.

Uwaga

W tym artykule założono, że wiesz, jak używać Migracje Code First w podstawowych scenariuszach. Jeśli tego nie zrobisz, musisz przeczytać Migracje Code First przed kontynuowaniem.

Co to jest tabela historii migracji?

Tabela historii migracji to tabela używana przez Migracje Code First do przechowywania szczegółów migracji zastosowanych do bazy danych. Domyślnie nazwa tabeli w bazie danych jest __MigrationHistory i jest tworzona podczas stosowania pierwszej migracji do bazy danych. W programie Entity Framework 5 ta tabela była tabelą systemową, jeśli aplikacja korzystała z bazy danych programu Microsoft Sql Server. Ta zmiana została jednak zmieniona w programie Entity Framework 6, a tabela historii migracji nie jest już oznaczona tabelą systemową.

Dlaczego warto dostosować tabelę historii migracji?

Tabela historii migracji ma być używana wyłącznie przez Migracje Code First i zmiana jej ręcznie może przerwać migracje. Jednak czasami konfiguracja domyślna nie jest odpowiednia i należy dostosować tabelę, na przykład:

  • Musisz zmienić nazwy i/lub aspekty kolumn, aby umożliwić dostawcy migracji 3 rd party
  • Chcesz zmienić nazwę tabeli
  • Musisz użyć schematu innego niż domyślny dla tabeli __MigrationHistory
  • Musisz przechowywać dodatkowe dane dla danej wersji kontekstu i dlatego należy dodać dodatkową kolumnę do tabeli

Słowa ostrożności

Zmiana tabeli historii migracji jest zaawansowana, ale należy uważać, aby nie przesadzyć. Środowisko uruchomieniowe EF obecnie nie sprawdza, czy niestandardowa tabela historii migracji jest zgodna ze środowiskiem uruchomieniowym. Jeśli nie jest to aplikacja, może uszkodzić środowisko uruchomieniowe lub zachowywać się w nieprzewidywalny sposób. Jest to jeszcze ważniejsze, jeśli używasz wielu kontekstów dla bazy danych, w tym przypadku wiele kontekstów może używać tej samej tabeli historii migracji do przechowywania informacji o migracji.

Jak dostosować tabelę historii migracji?

Przed rozpoczęciem musisz wiedzieć, że możesz dostosować tabelę historii migracji dopiero przed zastosowaniem pierwszej migracji. Teraz przejdź do kodu.

Najpierw należy utworzyć klasę pochodzącą z klasy System.Data.Entity.Migrations.History.HistoryContext. Klasa HistoryContext pochodzi z klasy DbContext, więc konfigurowanie tabeli historii migracji jest bardzo podobne do konfigurowania modeli EF za pomocą płynnego interfejsu API. Wystarczy zastąpić metodę OnModelCreating i użyć płynnego interfejsu API do skonfigurowania tabeli.

Uwaga

Zazwyczaj podczas konfigurowania modeli EF nie trzeba wywoływać bazy. OnModelCreating() z zastąpionej metody OnModelCreating, ponieważ element DbContext.OnModelCreating() ma pustą treść. Nie jest tak w przypadku konfigurowania tabeli historii migracji. W takim przypadku pierwszą rzeczą do wykonania w zastąpieniu OnModelCreating() jest wywołanie bazy. OnModelCreating(). Spowoduje to skonfigurowanie tabeli historii migracji w domyślny sposób, który następnie dostosujesz w metodzie zastępowania.

Załóżmy, że chcesz zmienić nazwę tabeli historii migracji i umieścić ją w niestandardowym schemacie o nazwie "admin". Ponadto administrator bazy danych chce zmienić nazwę kolumny MigrationId na Migration_ID.  Można to osiągnąć, tworząc następującą klasę pochodzącą z klasy 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");
            }
        }
    }

Gdy niestandardowy element HistoryContext będzie gotowy, musisz poinformować o nim platformę EF, rejestrując ją za pomocą konfiguracji opartej na kodzie:

    using System.Data.Entity;

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

To w zasadzie wszystko. Teraz możesz przejść do konsoli Menedżer pakietów, enable-migrations, add-migration i wreszcie Update-Database. Powinno to spowodować dodanie do bazy danych tabeli historii migracji skonfigurowanej zgodnie ze szczegółami określonymi w klasie pochodnej HistoryContext.

Migrations History Table