EF Migrations, EF 4.3 y que nos deparará el futuro

Hoy mismo se ha hecho pública la primera beta del paquete de “migraciones” que el equipo de Entity Framework ha estado preparando durante ya hace algún tiempo, de hecho, en este mismo blog ya hemos publicado unas cuantras entradas,aquí y aquí, referidas a su funcionamiento. Lo más destacable de este anuncio, a mayores de los cambios y novedades en el paquete, comentaremos sobre esto más adelante, es el hecho de que incorporarán Migrations como parte de EF 4.3, es decir, que ya no existirá el paquete EntityFramework.Migrations como tal. Desde mi punto de vista, esto es sin duda una gran idea, puesto que el trabajo con migraciones no es “algo opcional” en un proyecto real.  Hablando con un miembro del equipo sobre cuales serían las implicaciones directas de este paso se puso sobre la mesa la posibilidad de que alguna funcionalidad estuviera duplicada entre el code base de EF Code First y el paquete de migraciones. Un ejemplo de esto, podría ser por ejemplo los inicializadores de EF, IDatabaseInitializer<T> cuya funcionalidad podría solaparse con el Seed que podemos hacer en nuestro DbMigrationsConfiguration, aunque en mi opinión ambos podrian tener propósitos diferentes. Lo más interesante de este movimiento, es lo que se puede leer por detrás, es decir, como poco a poco el equipo de EF está haciendo movimientos para apartarse de la dependencia de .NET Framework, dependencia que seguro que afecta enormemente a su ciclo de vida, a su capacidad de entrega y a la resolución de problema de una forma más agil. Seguro, que no dentro de mucho, nos darán alguna sorpresa en cuanto al ciclo de vida y modelo de desarrollo con respecto a EF.

 

Bueno, al chollo:

Realmente, el funcionamiento de esta beta es bastantet similar, de hecho ya advierte de que hay unas pequeñas features y sobre todo refactoring. Lo primero en lo que nos podemos fijar con respecto a las versiones anteriores es que ahora la clase DbMigrationContext de las versiones anteriores se sustituye por DbMigrationsConfiguration:

 

    internal sealed class Configuration : DbMigrationsConfiguration<BlogUnitOfWork>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        
            // Seed data: 
            //   Override the Seed method in this class to add seed data.
            //    - The Seed method will be called after migrating to the latest version.
            //    - You can use the DbContext.AddOrUpdate() helper extension method to avoid creating
            //      duplicate seed data. E.g.
            //
            //          myContext.AddOrUpdate(c => c.FullName,
            //              new Customer { FullName = "Andrew Peters", CustomerNumber = 123 },
            //              new Customer { FullName = "Brice Lambson", CustomerNumber = 456 },
            //              new Customer { FullName = "Rowan Miller", CustomerNumber = 789 }
            //          );
            //
        }
    }

Por supuesto, aunque ahora no se muestren, esta clase nos sigue ofreciendo la posibilidad de establecer las generadores de código SQL y codigo C# de las migraciones que hagamos, además de otra serie de flags, como por ejemplo AutomaticMigrationDataLossAlowed, que nos permitirán modificar algún comportamiento adicional. Otro elemento a mayores, es ver como han creado un nuevo método extensor, AddOrUpdate que nos simplificará el Seed de los datos.

    public partial class InitalSteep : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "Blogs",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Title = c.String(),
                        Description = c.String(),
                        AuthorId = c.Int(nullable: false),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("Authors", t => t.AuthorId, cascadeDelete: true)
                .Index(t => t.AuthorId);
            
            CreateTable(
                "Authors",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        FirstName = c.String(),
                        LastName = c.String(),
                    })
                .PrimaryKey(t => t.Id);
            
        }
        
        public override void Down()
        {
            DropIndex("Blogs", new[] { "AuthorId" });
            DropForeignKey("Blogs", "AuthorId", "Authors", "Id");
            DropTable("Authors");
            DropTable("Blogs");
        }
    }

Al igual que hacíamos antes, también podemos hacer customizaciones en las distintas migraciones, así, por ejemplo, si nos interesará poder un índice sobre la columna FirstName de nuestra tabla authors podríamos hacer alog como lo siguiente: 

           CreateTable(
                "Authors",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        FirstName = c.String(),
                        LastName = c.String(),
                    })
                .PrimaryKey(t => t.Id)
                .Index(a=>a.FirstName,true);

A mayores de los métodos de customización de DbMigration, base para todas las definiciones de migración, esta nos ofrece un método llamado Sql que nos servirá para ejecutar, en el caso de necesitarlo, un comando SQL, como por ejemplo un  UPDATE para poner un valor por defecto a una de las nuevas columnas, etc.

Bueno, aquí se queda esto por ahora… Para los que os guste el tema y aún no hayais podido profundizar os recomienod los recomiendo las guias paso a paso del equipo de Entity Framework que están aquí y aquí.

 

Nos despedimos hasta la próxima dónde empezaremos una serie sobre RavenDB.

 

Un saludo

Unai

Published 30/11/2011 18:50 por Unai
Comparte este post:
http://geeks.ms/blogs/unai/archive/2011/11/30/ef-migrations-ef-4-3-y-que-nos-deparar-225-el-futuro.aspx

Comentarios

# re: EF Migrations, EF 4.3 y que nos deparará el futuro

Hola Unai:

Da la sensación de que falta algo en el artículo, por el párrafo que empieza "mayores," y por el "Podríamos pensar..." que no se concluye. ¿Es posible?

Thursday, December 1, 2011 8:56 AM por Pablo Núñez

# re: EF Migrations, EF 4.3 y que nos deparará el futuro

Gracias Pablo, efectivamente, parece que el live writer se ha comido alguna cosa, a ver si puedo revisarlo online... revisaré también los que estan en draft no vaya a ser...

Unai

Thursday, December 1, 2011 9:09 AM por Unai

# re: EF Migrations, EF 4.3 y que nos deparará el futuro

Hola,

El link a RavenDB está mal...

Thursday, December 1, 2011 9:23 AM por JuanLu

# re: EF Migrations, EF 4.3 y que nos deparará el futuro

Vaya dia, JuanLu, efectivamente el Link a www.ravendb.net estaba incorrecto.

Unai

Thursday, December 1, 2011 9:57 AM por Unai

# EF 4.3 Beta 1: más madera….y un pequeño extra…

Cuando se publique este blog habrá salido ya el anuncio de la primera beta de ADO.NET EF 4.3 en

Friday, January 13, 2012 8:46 AM por O bruxo mobile