De geschiedenistabel van migraties aanpassen

Opmerking

EF6 Vanaf: de functies, API's enz. die op deze pagina worden besproken, zijn geïntroduceerd in Entity Framework 6. Als u een eerdere versie gebruikt, zijn sommige of alle gegevens niet van toepassing.

Opmerking

In dit artikel wordt ervan uitgegaan dat u weet hoe u Code First Migrations gebruikt in basisscenario's. Als u dat niet doet, moet u Code First Migrations lezen voordat u doorgaat.

Wat is de geschiedenistabel van migraties?

De geschiedenistabel van migraties is een tabel die wordt gebruikt door Code First Migrations voor het opslaan van details over migraties die zijn toegepast op de database. De naam van de tabel in de database wordt standaard __MigrationHistory en wordt gemaakt bij het toepassen van de eerste migratie op de database. In Entity Framework 5 was deze tabel een systeemtabel als de toepassing microsoft Sql Server-database gebruikte. Dit is echter gewijzigd in Entity Framework 6 en de geschiedenistabel van migraties wordt niet langer gemarkeerd als een systeemtabel.

Waarom migratiegeschiedenistabel aanpassen?

De geschiedenistabel van migraties moet alleen worden gebruikt door Code First Migrations en het handmatig wijzigen ervan kan migraties verbreken. Soms is de standaardconfiguratie echter niet geschikt en moet de tabel worden aangepast, bijvoorbeeld:

  • U moet de namen en/of facetten van de kolommen wijzigen om een derdepartij-migratieprovider in te schakelen.
  • U wilt de naam van de tabel wijzigen
  • U moet een niet-standaardschema gebruiken voor de __MigrationHistory tabel
  • U moet aanvullende gegevens opslaan voor een bepaalde versie van de context en daarom moet u een extra kolom toevoegen aan de tabel

Woorden van voorzorg

Het wijzigen van de migratiegeschiedenistabel is krachtig, maar u moet voorzichtig zijn om deze niet te overschrijven. Ef-runtime controleert momenteel niet of de aangepaste geschiedenistabel van migraties compatibel is met de runtime. Als het niet uw toepassing is, kan deze tijdens runtime worden onderbroken of zich op onvoorspelbare manieren gedragen. Dit is nog belangrijker als u meerdere contexten per database gebruikt. In dat geval kunnen meerdere contexten dezelfde migratiegeschiedenistabel gebruiken om informatie over migraties op te slaan.

Migratiegeschiedenistabel aanpassen

Voordat u begint, moet u weten dat u de geschiedenistabel voor migraties alleen kunt aanpassen voordat u de eerste migratie toepast. Nu, naar de code.

Eerst moet u een klasse maken die is afgeleid van de klasse System.Data.Entity.Migrations.History.HistoryContext. De HistoryContext-klasse is afgeleid van de DbContext-klasse, zodat het configureren van de geschiedenistabel van migraties vergelijkbaar is met het configureren van EF-modellen met fluent API. U hoeft alleen de OnModelCreating-methode te overschrijven en fluent API te gebruiken om de tabel te configureren.

Opmerking

Wanneer je EF-modellen configureert, hoef je doorgaans niet de method base.OnModelCreating() aan te roepen vanuit de overschreven OnModelCreating-methode, omdat DbContext.OnModelCreating() een lege body heeft. Dit is niet het geval bij het configureren van de geschiedenistabel van migraties. In dit geval moet u als eerste stap in uw OnModelCreating()-override ook echt base.OnModelCreating() aanroepen. Hiermee configureert u de migratiegeschiedenistabel op de standaardmanier die u vervolgens wijzigt in de overschrijfmethode.

Stel dat u de naam van de geschiedenistabel voor migraties wilt wijzigen en deze wilt plaatsen in een aangepast schema met de naam 'admin'. Daarnaast wilt uw DBA de naam van de kolom MigrationId wijzigen in Migration_ID.  U kunt dit bereiken door de volgende klasse te maken die is afgeleid van 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");
            }
        }
    }

Zodra uw custom HistoryContext gereed is, moet u ef hiervan op de hoogte stellen door deze te registreren via configuratie op basis van code:

    using System.Data.Entity;

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

Dat is vrijwel alles. U kunt nu naar de Package Manager-console, Enable-Migrations, Add-Migration en ten slotte Update-Database gaan. Dit moet resulteren in het toevoegen aan de database van een migratiegeschiedenistabel die is geconfigureerd op basis van de details die u hebt opgegeven in de afgeleide klasse HistoryContext.

Migraties Geschiedenistabel