Personnalisation de la table d’historique des migrations

Remarque

EF6 et versions ultérieures uniquement : Les fonctionnalités, les API, etc. décrites dans cette page ont été introduites dans Entity Framework 6. Si vous utilisez une version antérieure, certaines ou toutes les informations ne s’appliquent pas.

Remarque

Cet article part du principe que vous savez comment utiliser les Migrations Code First dans des scénarios de base. Si ce n’est pas le cas, vous devez lire Migrations Code First avant de continuer.

Qu’est-ce qu’une table d’historique des migrations ?

La table d’historique des migrations est une table utilisée par Code First Migrations pour stocker des détails sur les migrations appliquées à la base de données. Par défaut, le nom de la table dans la base de données est __MigrationHistory et il est créé lors de l’application de la première migration à la base de données. Dans Entity Framework 5, cette table était une table système si l’application utilisait la base de données Microsoft Sql Server. Cela a changé dans Entity Framework 6, mais la table d’historique des migrations n’est plus marquée comme une table système.

Pourquoi personnaliser l’historique des migrations ?

La table d’historique des migrations est censée être utilisée uniquement par Code First Migrations et la modification manuelle peut interrompre les migrations. Toutefois, parfois, la configuration par défaut n’est pas appropriée et la table doit être personnalisée, par exemple :

  • Vous devez modifier les noms et/ou facettes des colonnes pour activer un fournisseur de migrations tierce
  • Vous souhaitez modifier le nom de la table
  • Vous devez utiliser un schéma non par défaut pour la table __MigrationHistory
  • Vous devez stocker des données supplémentaires pour une version donnée du contexte et, par conséquent, vous devez ajouter une colonne supplémentaire à la table

Mots de précaution

La modification de la table d’historique de migration est puissante, mais vous devez faire attention à ne pas la remplacer. Le runtime EF ne vérifie actuellement pas si la table d’historique des migrations personnalisée est compatible avec le runtime. S’il ne s’agit pas de votre application, il peut s’arrêter au moment de l’exécution ou se comporter de manière imprévisible. Cela est encore plus important si vous utilisez plusieurs contextes par base de données, auquel cas plusieurs contextes peuvent utiliser la même table d’historique de migration pour stocker des informations sur les migrations.

Comment personnaliser l’historique des migrations ?

Avant de commencer, vous devez savoir que vous pouvez personnaliser la table d’historique des migrations uniquement avant d’appliquer la première migration. À présent, dans le code.

Tout d’abord, vous devez créer une classe dérivée de la classe System.Data.Entity.Migrations.History.HistoryContext. La classe HistoryContext est dérivée de la classe DbContext, de sorte que la configuration de la table d’historique des migrations est très similaire à la configuration des modèles EF avec l’API Fluent. Vous devez simplement remplacer la méthode OnModelCreating et utiliser l’API Fluent pour configurer la table.

Remarque

En règle générale, lorsque vous configurez des modèles EF, vous n’avez pas besoin d’appeler base.OnModelCreating() de la méthode OnModelCreating substituée, car DbContext.OnModelCreating() a un corps vide. Ce n’est pas le cas lors de la configuration de la table d’historique des migrations. Dans ce cas, la première chose à faire dans votre remplacement OnModelCreating() consiste à appeler réellement la base. OnModelCreating(). Cette opération configure la table d’historique des migrations « par défaut » que vous modifiez ensuite dans la méthode de substitution.

Supposons que vous souhaitez renommer la table d’historique des migrations et la placer dans un schéma personnalisé appelé « administrateur ». En plus de votre DBA, vous souhaitez renommer la colonne MigrationId en Migration_ID.  Pour ce faire, vous pouvez créer la classe suivante dérivée de 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");
            }
        }
    }

Une fois que votre HistoryContext personnalisé est prêt, vous devez l’informer d’EF en l’inscrivant via configuration basée sur le code:

    using System.Data.Entity;

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

C’est à peu près tout. Vous pouvez maintenant accéder à la console du Gestionnaire de package, activer-migrations, ajouter une migration et enfin mettre à jour la base de données. Cela doit entraîner l’ajout à la base de données d’une table d’historique des migrations configurée en fonction des détails que vous avez spécifiés dans votre classe dérivée HistoryContext.

Migrations History Table