Usando Entity Framework Migrations


Buenas a todos,

Os quería contar como ha sido mi experiencia con esta herramienta que ofrece EntityFramework y de la que hasta ayer, solo había oído hablar vagamente.

Antes de nada un poco de teoría que he podido resumir de algunos enlaces de interés y que como siempre os pondré a continuación

El concepto de migración, nos permite tener un control sobre los cambios que se realizan en el modelo de datos y su aplicación sobre la base de datos de nuestro contexto. Nos permite tener un control sobre la versión instalada de nuestro modelo y los cambios que se han aplicado en cada migración, y nos da la opción de recuperar en cada momento una versión anterior cualquiera.

Anterior a la aparición de las migraciones podíamos utilizar otras estrategias de actualización de la base de datos, tales como CreateDatabaseIfNotExists, DropCreateDatabaseIfModelChanges o DropCreateDatabaseAlways, pero podría dar algunos problemas con la existencias de Triggers, Procedimientos Almacenados etc.

Os paso aquí los enlaces de referencia que me han resultado interesantes

http://www.entityframeworktutorial.net/code-first/migration-in-code-first.aspx

http://www.entityframeworktutorial.net/code-first/code-based-migration-in-code-first.aspx

http://ielcoro.azurewebsites.net/2012/12/20/entity-framewor-code-migrations-parte-1/

El motivo por el que yo me encontré con el concepto de migraciones, fue por la necesidad de añadir algunos aspectos más avanzados a mi base de datos, concretamente necesitaba añadir índices. Yo venía usando la aproximación Model-First y no podía, hacer lo que necesitaba correctamente. Así que, decidí cambiar a Code-First y usar Migrations para actualizar la base de datos, pasando a tener un control total del código de mi modelo de datos, en lugar del auto-generado que tenía antes.

Vamos a ver como se trabaja. Para usar Migrations, en primer lugar hay que crear el modelo y el contexto de base de datos.

    public partial class Provider
    {
        public Provider()
        {
        }

        public int Id { get; set; }

        [Required]
        public string Name { get; set; }

        [Required]
        public string Phone { get; set; }

        [Required]
        public string Email { get; set; }
    }

    public partial class Entities : DbContext
    {
        public Entities()
            : base("name=Entities")
        {
        }

        public virtual DbSet<Provider> Provider { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }
    }

Una vez creado, el siguiente paso. Es habilitar Migrations en nuestro proyecto. Para ello, abrimos la consola de administración de paquetes y usamos el comando.

Enable-Migrations -ContextTypeName -EnableAutomaticMigrations

Esto habilitará Migrations en nuestro proyecto y veremos que se ha añadido una carpeta Migrations en nuestro proyecto y un archivo Configuration.cs. El siguiente paso es crear una primera migración, para lo que utilizaremos el siguiente comando:

Add-Migration InitialMigration

Esto nos crea una clase en la carpeta con la información de la migración y a través de esta clase, si lo deseamos, podemos añadir más cambios, que la generación automática de código no haya podido aplicar, además se crea también un SnapShot del estado de la base de datos, que se utilizará en futuras migraciones para detectar los cambios que se hayan producido en el modelo.

Hasta aquí, hemos dado por hecho que estamos usando una aproximación Code-First, pero puede que tuviéramos una base de datos ya existente (como en mi caso), a partir de la que hemos creado el modelo. En este caso, observaremos que si usamos el comando Add-Migration tal y como hemos dicho antes, nos dará un error diciendo que las tablas ya existen. Para ello, en el caso de que hayamos generado el modelo desde una base de datos existente, usaremos el comando de la siguiente manera para la migración inicial.

Add-Migration InitialMigration -IgnoreChanges

Esto generará una migración sin cambios, creando el SnapShot que nos servirá para comparar en un futuro, con próximas Migraciones

Por último para hacer un commit de la actualización de la Base de Datos, usaremos finalmente el siguiente comando:

Update-Database

Esto aplicará los cambios sobre la Base de Datos. Además, para llevar un control del historial de migraciones, en la base de datos, se crea una tabla _MigrationHistory, donde se almacena en un registro la información sobre cada una de las migraciones realizadas. Además, por medio del comando Update-Database, podemos recuperar la migración que queramos, porque, p.e., puede ser necesitemos hacer un rollback de la migración porque esté corrupta. Podemos hacerlo de la siguiente manera.

update-database -TargetMigration:”InitialMigration”

De esta forma podemos mantener actualizada la Base de Datos de nuestro sistema y mantener la integridad entre el modelo y la base de datos. Es importante, adquirir una rutina del funcionamiento de Migrations, que se puede resumir de la siguiente manera:

  1. Modificar el Modelo
  2. Ejecutar Add-Migration
  3. Ejecutar Update-Database

Por último, otro enlace donde podéis aprender mucho sobre Migrations y que me ha servido bastante.

http://msdn.microsoft.com/en-us/data/dn579398.aspx

Y hasta aquí lo que he aprendido sobre el uso de Entity Frameworks Migrations, espero que os haya servido de utilidad.

Por cierto, para índices a un modelo, basta con añadir en el campo que quieres indexar la anotación [Index].

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s