Teilen über


Anpassen der Migrationsverlaufstabelle

Hinweis

Nur EF6 und höher: Die Features, APIs usw., die auf dieser Seite erläutert werden, wurden in Entity Framework 6 eingeführt. Wenn Sie eine frühere Version verwenden, gelten manche Informationen nicht.

Hinweis

In diesem Artikel wird davon ausgegangen, dass Ihnen bekannt ist, wie Sie Code First-Migrationen in Basisszenarien verwenden. Wenn nicht, sollten Sie Code First-Migrationen lesen, bevor Sie fortfahren.

Was ist die Migrationsverlaufstabelle?

Die Migrationsverlaufstabelle ist eine Tabelle, die von Code First-Migrationen verwendet wird, um Details über Migrationen zu speichern, die auf die Datenbank angewendet werden. Standardmäßig ist der Name der Tabelle in der Datenbank __MigrationHistory, und sie wird beim Anwenden der ersten Migration auf die Datenbank erstellt. In Entity Framework 5 war diese Tabelle eine Systemtabelle, wenn die Anwendung Microsoft SQL Server-Datenbank verwendet hat. Dies hat sich jedoch in Entity Framework 6 geändert, und die Migrationsverlaufstabelle ist nicht mehr als Systemtabelle gekennzeichnet.

Warum die Migrationsverlaufstabelle anpassen?

Die Migrationsverlaufstabelle sollte ausschließlich von Code First-Migrationen verwendet werden, und sie zu verändern kann Migrationen unterbrechen. Manchmal ist die Standardkonfiguration jedoch nicht geeignet, und die Tabelle muss angepasst werden, beispielsweise wie folgt:

  • Sie müssen Namen und/oder Facetten der Spalten ändern, um einen Drittanbieter für Migrationen zu aktivieren
  • Sie möchten den Namen der Tabelle ändern
  • Sie müssen ein nicht standardmäßiges Schema für die __MigrationHistory-Tabelle verwenden
  • Sie müssen zusätzliche Daten für eine bestimmte Version des Kontexts speichern und daher müssen Sie der Tabelle eine zusätzliche Spalte hinzufügen

Worte der Vorsicht

Das Ändern der Migrationsverlaufstabelle ist leistungsfähig, aber Sie müssen aufpassen, es nicht zu übertreiben. Die EF-Runtime überprüft derzeit nicht, ob die angepasste Migrationsverlaufstabelle mit der Runtime kompatibel ist. Falls nicht, kann es zu einer Unterbrechung Ihrer Anwendung zur Laufzeit kommen oder sie kann sich auf unvorhersehbare Weise verhalten. Dies ist noch wichtiger, wenn Sie mehrere Kontexte pro Datenbank verwenden. In diesem Fall können mehrere Kontexte dieselbe Migrationsverlaufstabelle verwenden, um Informationen zu Migrationen zu speichern.

Wie kann ich die Migrationsverlaufstabelle anpassen?

Bevor Sie beginnen, müssen Sie wissen, dass Sie die Migrationsverlaufstabelle nur anpassen können, bevor Sie die erste Migration anwenden. Jetzt aber zum Code.

Zunächst müssen Sie eine von der System.Data.Entity.Migrations.History.HistoryContext-Klasse abgeleitete Klasse erstellen. Die HistoryContext-Klasse wird von der DbContext-Klasse abgeleitet, sodass die Konfiguration der Migrationsverlaufstabelle dem Konfigurieren von EF-Modellen mit Fluent-API sehr ähnlich ist. Sie müssen lediglich die OnModelCreating-Methode überschreiben und die Fluent-API verwenden, um die Tabelle zu konfigurieren.

Hinweis

Normalerweise müssen Sie beim Konfigurieren von EF-Modellen base.OnModelCreating() aus der überschriebenen OnModelCreating-Methode nicht aufrufen, da der DbContext.OnModelCreating() einen leeren Textkörper hat. Dies ist nicht der Fall beim Konfigurieren der Migrationsverlaufstabelle. In diesem Fall besteht der erste Schritt in Ihrer OnModelCreating()-Überschreibung darin, tatsächlich base.OnModelCreating() aufzurufen. Dadurch wird die Migrationsverlaufstabelle auf die Standardmethode konfiguriert, die Sie dann in der Überschreibungsmethode anpassen.

Angenommen, Sie möchten die Migrationsverlaufstabelle umbenennen und in ein benutzerdefiniertes Schema namens „Admin“ einfügen. Darüber hinaus möchte Ihr DBA die Spalte MigrationId in Migration_ID umbenennen.  Sie können dies erreichen, indem Sie die folgende, von HistoryContext abgeleitete Klasse erstellen:

    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");
            }
        }
    }

Sobald Ihr benutzerdefinierter HistoryContext bereit ist, müssen Sie EF darauf aufmerksam machen, indem Sie ihn über codebasierte Konfiguration registrieren:

    using System.Data.Entity;

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

Das war's im Prinzip. Jetzt können Sie zur Paket-Manager-Konsole wechseln und Enable-Migration, Add-Migration und schließlich Update-Database ausführen. Dies sollte dazu führen, dass der Datenbank eine Migrationsverlaufstabelle hinzugefügt wird, die entsprechend den Details konfiguriert ist, die Sie in Ihrer von abgeleiteten HistoryContext-Klasse festgelegt haben.

Migrations History Table