DbMigration y Code First - El blog de Javier Torrecilla

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!

Published 16/3/2012 9:54 por Javier Torrecilla
Archivado en: ,,,,,
Comparte este post:
http://geeks.ms/blogs/jtorrecilla/archive/2012/03/16/dbmigration-y-code-first.aspx

Comentarios

# re: DbMigration y Code First

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.

Friday, March 16, 2012 10:25 AM por panicoenlaxbox

# re: DbMigration y Code First

Hi!,

Por defecto te va a publicar la última versión disponible.

En este caso la versión 4.3.1 de EF es BETA por lo que no es recomendable para entornos de producción .

Dale un vistazo a docs.nuget.org/.../using-the-package-manager-console

Y si desde la consola de comandos escribes:

get-Help Install-Package -full

Te pondrá todos los parametros :D

Saludos!

Friday, March 16, 2012 11:04 AM por Javier Torrecilla

# re: DbMigration y Code First

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 blogs.msdn.com/.../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.

Friday, March 16, 2012 5:51 PM por panicoenlaxbox

# re: DbMigration y Code First

@panicoenlaxbox llevas toda la razón #fail mio la 4.3.1 es correción de bugs de la 4.3 y la 5 es la Beta.

Gracias por la correción!!

Friday, March 16, 2012 6:07 PM por Javier Torrecilla

# Entity Framework y los indices únicos.

Ya me imaginaba yo que después de ver con Profiler las sentencias que genera  con algún que otro

Wednesday, April 04, 2012 12:32 AM por El Blog de Pedro Hurtado

# re: DbMigration y Code First

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.

Saturday, April 14, 2012 6:42 AM por xmeele