Condividi tramite


Personalizzazione della tabella della cronologia delle migrazioni

Nota

Solo EF6 e versioni successive: funzionalità, API e altri argomenti discussi in questa pagina sono stati introdotti in Entity Framework 6. Se si usa una versione precedente, le informazioni qui riportate, o parte di esse, non sono applicabili.

Nota

Questo articolo presuppone che si sappia come usare Migrazioni Code First in scenari di base. In caso contrario, sarà necessario leggere Migrazioni Code First prima di continuare.

Che cos'è la tabella della cronologia delle migrazioni?

La tabella della cronologia delle migrazioni è una tabella usata da Migrazioni Code First per archiviare i dettagli sulle migrazioni applicate al database. Per impostazione predefinita, il nome della tabella nel database è __MigrationHistory e viene creato quando si applica la prima migrazione al database. In Entity Framework 5 questa tabella era una tabella di sistema se l'applicazione usava il database di Microsoft Sql Server. Questa modifica è stata modificata in Entity Framework 6 e la tabella della cronologia delle migrazioni non è più contrassegnata come tabella di sistema.

Perché personalizzare la tabella della cronologia delle migrazioni?

La tabella della cronologia delle migrazioni deve essere usata esclusivamente da Migrazioni Code First e modificarla manualmente può interrompere le migrazioni. Tuttavia, a volte la configurazione predefinita non è adatta e la tabella deve essere personalizzata, ad esempio:

  • È necessario modificare i nomi e/o i facet delle colonne per abilitare un provider di 3migrazioni rd party
  • Si vuole modificare il nome della tabella
  • È necessario usare uno schema non predefinito per la tabella __MigrationHistory
  • È necessario archiviare dati aggiuntivi per una determinata versione del contesto e pertanto è necessario aggiungere una colonna aggiuntiva alla tabella

Parole di precauzione

La modifica della tabella della cronologia della migrazione è efficace, ma è necessario prestare attenzione a non esagerare. Il runtime di EF non controlla attualmente se la tabella della cronologia delle migrazioni personalizzate è compatibile con il runtime. In caso contrario, l'applicazione potrebbe interrompersi in fase di esecuzione o comportarsi in modi imprevedibili. Ciò è ancora più importante se si usano più contesti per database, nel qual caso più contesti possono usare la stessa tabella della cronologia di migrazione per archiviare informazioni sulle migrazioni.

Come personalizzare la tabella della cronologia delle migrazioni?

Prima di iniziare, è necessario sapere che è possibile personalizzare la tabella della cronologia delle migrazioni solo prima di applicare la prima migrazione. A questo momento, al codice.

Prima di tutto, è necessario creare una classe derivata dalla classe System.Data.Entity.Migrations.History.HistoryContext. La classe HistoryContext deriva dalla classe DbContext, quindi la configurazione della tabella della cronologia delle migrazioni è molto simile alla configurazione dei modelli EF con l'API Fluent. È sufficiente eseguire l'override del metodo OnModelCreating e usare l'API Fluent per configurare la tabella.

Nota

In genere, quando si configurano i modelli ef non è necessario chiamare base. OnModelCreating() dal metodo OnModelCreating sottoposto a override perché DbContext.OnModelCreating() ha un corpo vuoto. Non si tratta del caso durante la configurazione della tabella della cronologia delle migrazioni. In questo caso, la prima operazione da eseguire nell'override onModelCreating() consiste nel chiamare effettivamente base. OnModelCreating(). In questo modo verrà configurata la tabella della cronologia delle migrazioni nel modo predefinito in cui si modifica il metodo di override.

Si supponga di voler rinominare la tabella della cronologia delle migrazioni e inserirla in uno schema personalizzato denominato "admin". Inoltre, l'amministratore di database vuole rinominare la colonna MigrationId in Migration_ID.  A tale scopo, è possibile creare la classe seguente derivata da 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");
            }
        }
    }

Quando HistoryContext personalizzato è pronto, è necessario renderlo consapevole di EF registrandolo tramite la configurazione basata su codice:

    using System.Data.Entity;

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

Questo è tutto. È ora possibile passare alla console di Gestione pacchetti, alle migrazioni abilitate, alla migrazione dei componenti aggiuntivi e infine a Update-Database. Ciò dovrebbe comportare l'aggiunta al database di una tabella della cronologia delle migrazioni configurata in base ai dettagli specificati nella classe derivata HistoryContext.

Migrations History Table