DbMigration y Code First

Introducción

Una de las novedades que se introdujo con la versión 4.3 de Entity Framework son las llamadas Database Migration (DbMigration), que vienen a satisfacer las necesidades de los desarrolladores a la hora de realizar cambios en la estructura de la base de datos, como por ejemplo:

– Creación o borrado de Tablas.

– Cambiar o quitar columnas.

– entre otras cosas 🙂

La principal problemática venía a la hora de tener nuestra aplicación instalada en varios clientes y que tengan distintas versiones de Base de Datos.

Empezando

Para poder empezar a utilizar DbMigration es necesario que al “menos” tengamos instalada la versión 4.3.1(*) de Entity Framework, si no podremos instalarla desde nuget o desde la consola de comandos:

   1: Install-Package EntityFramework 

(*) Se encuentra en fase beta la version  5.0 de Entity Framework.

 

A continuación desde la consola de comandos, tendremos que especificar la habilitación de migraciones para nuestro proyecto, para ello ejecutaremos el comando “Enable-Migrations”.

Esta acción va a realizar los siguientes procesos:

– Va a buscar una clase dentro de nuestro proyecto que implemente la clase DBContext, para utilizar dicho contexto a la hora de definir las migraciones.

– Va a crear una nueva carpeta “Migrations” en nuestro proyecto. Esta carpeta va a contener los siguientes ficheros:

  1.  
    1. Clase Configuration.cs: Esta clase va a ser una implementación de la clase base genérica DbMigrationsConfiguration con nuestro objeto contexto.
      Dentro de ella, vamos a poder definir la configuración de la migración (en el constructor) y si hay que hacer algun proceso de llenado de información (método Seed).
    2. Una Migración Inicial: va a definir una clase que implemente la clase Base DbMigration, donde tendremos el método Up con la creación de nuestras entidades, y el método Down con el borrado de las mismas. La implementación de las migraciones se realiza en dos partes, la primera es la que acabamos de ver, y la segunda es relativa a información que se va a almacenar en la Base de Datos.

– Va a crear una tabla dentro de nuestra Base de Datos  llamada __MigrationHistory que va a almacenar información relativa a las migraciones.

 

¿Cómo crear una Migración?

Bien para crear una nueva migración desde la consola de comandos ejecutaremos la siguiente instrucción:

“Add-Migration Name”

Al ejecutarlo, se va a generar una nueva clase dentro de la carpeta Migrations, con una estructura similar a la mencionada anteriormente con la migración inicial.

Dentro de dicha clase vamos a tener que implementar los métodos Up, para subir de versión, y Down para bajar de versión.

¿Qué Métodos podemos utilizar en los métodos Up y Down?

AddColumn AddForeignKey AddPrimaryKey
AlterColumn CreateIndex CreateTable<T>
DropColumn DropForeignKey DropPrimaryKey
DropIndex DropTable MoveTable
RenameColumn RenameTable SQL

Ejemplo:

   1: public partial class ProductMigration : DbMigration

   2:     {

   3:         public override void Up()

   4:         {

   5:             CreateTable("Products",

   6:                 columns => new

   7:                 {

   8:                     ProductId = columns.Int(identity: true),

   9:                     Name = columns.String(maxLength: 100),

  10:                     Description = columns.String(),

  11:                     Price = columns.Decimal(precision: 10, scale: 2)

  12:                 });

  13:         }

  14:         

  15:         public override void Down()

  16:         {

  17:             DropTable("Products");

  18:         }

  19:     }

¿Cómo actualizar la Base de Datos?

Para poder ejecutar una migración tenemos dos posibles formas:

1) Desde la consola de Comandos:

A través del comando “Update-Database”. Los parámetros del comando son:

– SourceMigration <String>
– TargetMigration <String>
– Script [<SwitchParameter>]
– Force [<SwitchParameter>]
– ProjectName <String>
– StartUpProjectName <String>
– ConfigurationTypeName <String>
– ConnectionStringName <String>
– ConnectionString <String>
– ConnectionProviderName <String>
  

2) Desde código:

Definiremos un objeto del tipo Configuration, otro del tipo DbMigrator, y ejecutaremos el método Update:

   1: var config = new Migrations.Configuration();

   2:             var migrator = new DbMigrator(config);

   3:             migrator.Update();

Esta acción va a ejecutar la actualización a la ultima versión de la Base de Datos. En el caso de desear ejecutar una migración concreta o volver a una versión determinada, ejecutaríamos de la siguiente manera:

   1: var config = new Migrations.Configuration();

   2: var migrator = new DbMigrator(config);

   3: migrator.Update("201203140720163_InitialCreate");

 

 

Espero que os resulte de utilidad.

 

Saludos!

6 comentarios en “DbMigration y Code First”

  1. Hola Javier:
    Una pregunta, cuando instalas EF desde NuGet, sino pongo la versión me instala la 4.3.1 ¿Esta versión es estable? Lo digo porque no sabía que se podía poner el parámetro -version y entonces me estoy preguntando si cuando instalo EF desde NuGet sin especificar versión me está instalado una versión en beta?
    Un saludo.

  2. Hello!
    Gracias por la info.
    Lo gracioso es que si ejecuto el comando get-package -listavailable -filter entityframework -allversions me da que la última versión de EF es la 4.3.1, que curiosamente es la que instala si simplemente lanzas el comando install-package entityframework
    Por otro lado, si pongo el comando install-package entityframework -includeprerelease me instala la versión 5.0.0-beta1.
    En el blog de ADO.NET yo creo que dan la 4.3.1 como estable y sólo la 5 como beta http://blogs.msdn.com/b/adonet/archive/2012/02/29/ef4-3-1-and-ef5-beta-1-available-on-nuget.aspx
    Yo creo, y dios me libre de llevar la contraria al maestro xD que la versión estable es la 4.3.1
    En cualquier caso, mil gracias por tu tiempo y por tu esfuerzo 😉
    Un saludo.

  3. Una consulta, si tengo una aplicacion desarrollada en el EF 4.0, como es que puedo uogradear a las nuevas versiones, si el cambio es automatico o se tendria que hacer algunos cambios extras.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *