Anpassen der Migrations Verlaufs TabelleCustomizing the migrations history table

Hinweis

Nur EF6 und höher: Die Features, APIs usw., die auf dieser Seite erläutert werden, wurden in Entity Framework 6 eingeführt.EF6 Onwards Only - The features, APIs, etc. discussed in this page were introduced in Entity Framework 6. Wenn Sie eine frühere Version verwenden, gelten manche Informationen nicht.If you are using an earlier version, some or all of the information does not apply.

Hinweis

In diesem Artikel wird davon ausgegangen, dass Sie wissen, wie Code First-Migrationen in einfachen Szenarien verwendet wird.This article assumes you know how to use Code First Migrations in basic scenarios. Andernfalls müssen Sie Code First-Migrationen lesen, bevor Sie fortfahren.If you don’t, then you’ll need to read Code First Migrations before continuing.

Was ist eine Migrations Verlaufs Tabelle?What is Migrations History Table?

Die Migrations Verlaufs Tabelle ist eine Tabelle, die Code First-Migrationen verwendet, um Details zu den auf die Datenbank angewendeten Migrationen zu speichernMigrations history table is a table used by Code First Migrations to store details about migrations applied to the database. Standardmäßig ist der Name der Tabelle in der Datenbank _ _ migrationhistory und wird beim Anwenden der ersten Migration auf die Datenbank erstellt.By default the name of the table in the database is __MigrationHistory and it is created when applying the first migration to the database. In Entity Framework 5 war diese Tabelle eine Systemtabelle, wenn die Anwendung die Microsoft SQL Server-Datenbank verwendet hat.In Entity Framework 5 this table was a system table if the application used Microsoft Sql Server database. Dies wurde in Entity Framework 6 jedoch geändert, und die Migrations Verlaufs Tabelle ist nicht mehr als Systemtabelle gekennzeichnet.This has changed in Entity Framework 6 however and the migrations history table is no longer marked a system table.

Gründe für die Anpassung der Migrations Verlaufs TabelleWhy customize Migrations History Table?

Die Migrations Verlaufs Tabelle sollte ausschließlich von Code First-Migrationen verwendet und manuell geändert werden.Migrations history table is supposed to be used solely by Code First Migrations and changing it manually can break migrations. Manchmal ist die Standardkonfiguration jedoch nicht geeignet, und die Tabelle muss angepasst werden, zum Beispiel:However sometimes the default configuration is not suitable and the table needs to be customized, for instance:

  • Sie müssen die Namen und/oder Facetten der Spalten ändern, um einen Drittanbieter-Migrations Anbieter zu aktivieren.You need to change names and/or facets of the columns to enable a 3rd party Migrations provider
  • Sie möchten den Namen der Tabelle ändern.You want to change the name of the table
  • Sie müssen ein nicht standardmäßiges Schema für die _ _ migrationhistory-Tabelle verwenden.You need to use a non-default schema for the __MigrationHistory table
  • Sie müssen zusätzliche Daten für eine bestimmte Version des Kontexts speichern. Daher müssen Sie der Tabelle eine weitere Spalte hinzufügen.You need to store additional data for a given version of the context and therefore you need to add an additional column to the table

Begriffe der VorsichtsmaßnahmeWords of precaution

Das Ändern der Tabelle "Migrations Verlauf" ist zwar leistungsstark, aber Sie müssen darauf achten, Sie nicht zu überlasten.Changing the migration history table is powerful but you need to be careful to not overdo it. EF Runtime überprüft derzeit nicht, ob die angepasste Migrations Verlaufs Tabelle mit der Laufzeit kompatibel ist.EF runtime currently does not check whether the customized migrations history table is compatible with the runtime. Wenn dies nicht der Fall ist, kann die Anwendung zur Laufzeit unterbrechen oder sich auf unvorhersehbare Weise Verhalten.If it is not your application may break at runtime or behave in unpredictable ways. Dies ist noch wichtiger, wenn Sie mehrere Kontexte pro Datenbank verwenden. in diesem Fall können mehrere Kontexte dieselbe Migrations Verlaufs Tabelle verwenden, um Informationen über Migrationen zu speichern.This is even more important if you use multiple contexts per database in which case multiple contexts can use the same migration history table to store information about migrations.

Wie wird die Migrations Verlaufs Tabelle angepasst?How to customize Migrations History Table?

Bevor Sie beginnen, müssen Sie wissen, dass Sie die Migrations Verlaufs Tabelle erst anpassen können, bevor Sie die erste Migration anwenden.Before you start you need to know that you can customize the migrations history table only before you apply the first migration. Nun zum Code.Now, to the code.

Zunächst müssen Sie eine Klasse erstellen, die von der System. Data. Entity. Migrationen. History. historycontext-Klasse abgeleitet wird.First, you will need to create a class derived from System.Data.Entity.Migrations.History.HistoryContext class. Die historycontext-Klasse wird von der dbcontext-Klasse abgeleitet, sodass das Konfigurieren der Migrations Verlaufs Tabelle mit der Konfiguration von EF-Modellen mit der fließenden API sehr ähnlich ist.The HistoryContext class is derived from the DbContext class so configuring the migrations history table is very similar to configuring EF models with fluent API. Sie müssen lediglich die onmodelcreating-Methode außer Kraft setzen und die-Tabelle mit der flüssigen API konfigurieren.You just need to override the OnModelCreating method and use fluent API to configure the table.

Hinweis

In der Regel müssen Sie beim Konfigurieren von EF-Modellen die Basis nicht aufzurufen. Onmodelcreating () aus der überschriebenen onmodelcreating-Methode, da dbcontext. onmodelcreating () leeren Text enthält.Typically when you configure EF models you don’t need to call base.OnModelCreating() from the overridden OnModelCreating method since the DbContext.OnModelCreating() has empty body. Dies ist nicht der Fall, wenn die Migrations Verlaufs Tabelle konfiguriert wird.This is not the case when configuring the migrations history table. In diesem Fall besteht der erste Schritt in der onmodelcreating ()-Überschreibung darin, die Basis zu nennen. Onmodelcreating ().In this case the first thing to do in your OnModelCreating() override is to actually call base.OnModelCreating(). Dadurch wird die Migrations Verlaufs Tabelle auf die standardmäßige Weise konfiguriert, die Sie dann in der über schreibenden Methode optimieren.This will configure the migrations history table in the default way which you then tweak in the overriding method.

Nehmen wir an, Sie möchten die Migrations Verlaufs Tabelle umbenennen und Sie in ein benutzerdefiniertes Schema mit dem Namen "admin" einfügen.Let’s say you want to rename the migrations history table and put it to a custom schema called “admin”. Außerdem möchten Sie, dass der DBA die Spalte migrationid in Migration ID umbenennen soll _ .In addition your DBA would like you to rename the MigrationId column to Migration_ID. Dies können Sie erreichen, indem Sie die folgende Klasse erstellen, die von historycontext abgeleitet wurde: You could achieve this by creating the following class derived from 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");
            }
        }
    }

Sobald Ihr benutzerdefinierter historycontext bereit ist, müssen Sie EF darauf aufmerksam machen, indem Sie ihn über die Code basierte Konfigurationregistrieren:Once your custom HistoryContext is ready you need to make EF aware of it by registering it via code-based configuration:

    using System.Data.Entity;

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

Das ist ziemlich alles.That’s pretty much it. Nun können Sie die Paket-Manager-Konsole, Enable-Migrationen, Add-Migration und schließlich Update-Database aufrufen.Now you can go to the Package Manager Console, Enable-Migrations, Add-Migration and finally Update-Database. Dies sollte dazu führen, dass der Datenbank eine Migrations Verlaufs Tabelle entsprechend den Details, die Sie in der abgeleiteten historycontext-Klasse angegeben haben, hinzugefügt wird.This should result in adding to the database a migrations history table configured according to the details you specified in your HistoryContext derived class.

Migrations Verlaufs Tabelle