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:
-
- 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). - 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.
- Clase Configuration.cs: Esta clase va a ser una implementación de la clase base genérica DbMigrationsConfiguration con nuestro objeto contexto.
– 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!