Compartir vía


Personalización de la tabla de historial de migraciones

Nota:

Solo EF6 y versiones posteriores: las características, las API, etc. que se tratan en esta página se han incluido a partir de Entity Framework 6. Si usa una versión anterior, no se aplica parte o la totalidad de la información.

Nota:

En este artículo se da por supuesto que sabe cómo usar migraciones de Code First en escenarios básicos. De lo contrario, tendrá que leer Migraciones de Code First antes de continuar.

¿Qué es la tabla de historial de migraciones?

La tabla del historial de migraciones es una tabla usada por Migraciones de Code First para almacenar detalles sobre las migraciones aplicadas a la base de datos. De manera predeterminada, el nombre de la tabla de la base de datos es __MigrationHistory y se crea al aplicar la primera migración a la base de datos. En Entity Framework 5, esta tabla era una tabla del sistema si la aplicación usaba la base de datos de Microsoft Sql Server. Pero esto ha cambiado en Entity Framework 6 y la tabla del historial de migraciones ya no está marcada como una tabla del sistema.

¿Por qué personalizar el historial de migraciones?

Se supone que la tabla del historial de migraciones se debe usar únicamente en migraciones de Code First y cambiarla manualmente puede interrumpir las migraciones. Pero a veces la configuración predeterminada no es adecuada y la tabla se debe personalizar, por ejemplo:

  • Debe cambiar los nombres o las facetas de las columnas para habilitar un proveedor de migraciones de terceros
  • Quiere cambiar el nombre de la tabla
  • Debe usar un esquema no predeterminado para la tabla __MigrationHistory
  • Debe almacenar datos adicionales para una versión determinada del contexto y, por tanto, debe agregar una columna adicional a la tabla

Advertencias

El cambio de la tabla del historial de migraciones es eficaz, pero debe evitar hacerlo en exceso. El entorno de ejecución de EF no comprueba actualmente si la tabla de historial de migraciones personalizada es compatible con el tiempo de ejecución. Si la aplicación no es suya, puede interrumpirse en tiempo de ejecución o comportarse de maneras impredecibles. Esto es aún más importante si usa varios contextos por cada base de datos, en cuyo caso varios contextos pueden usar la misma tabla de historial de migraciones para almacenar información sobre las migraciones.

Procedimiento para personalizar la tabla de historial de migraciones

Antes de empezar, debe saber que solo puede personalizar la tabla de historial de migraciones antes de aplicar la primera migración. Ahora se pasará al código.

En primer lugar, deberá crear una clase derivada de la clase System.Data.Entity.Migrations.History.HistoryContext. La clase HistoryContext se deriva de la clase DbContext, por lo que la configuración de la tabla de historial de migraciones es muy similar a la configuración de modelos de EF con la API fluida. Solo tiene que invalidar el método OnModelCreating y usar la API fluida para configurar la tabla.

Nota:

Normalmente, cuando se configuran modelos de EF, no es necesario llamar a base.OnModelCreating() del método OnModelCreating invalidado, ya que DbContext.OnModelCreating() tiene un cuerpo vacío. Este no es el caso al configurar la tabla de historial de migraciones. En este caso, lo primero que debe hacer en la invalidación de OnModelCreating() es llamar realmente a base.OnModelCreating(). Esto configurará la tabla de historial de migraciones de la manera predeterminada que, después, ajustará en el método de invalidación.

Imagine que quiere cambiar el nombre de la tabla de historial de migraciones y colocarla en un esquema personalizado denominado "administrador". Además, el DBA quiere cambiar el nombre de la columna MigrationId por Migration_ID.  Para ello, puede crear la siguiente clase derivada 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");
            }
        }
    }

Una vez que la instancia personalizada de HistoryContext esté lista, para que EF la reconozca debe registrarla mediante configuración basada en código:

    using System.Data.Entity;

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

Eso es todo. Ahora puede ir a la consola del Administrador de paquetes y seleccionar Habilitar migraciones, Agregar migración y, por último, Actualizar base de datos. Como resultado, se debería agregar a la base de datos una tabla de historial de migraciones configurada según los detalles especificados en la clase derivada HistoryContext.

Migrations History Table