¿Eres de los que siempre les gusta probar las betas y alphas nuevas según salen para ver que es lo que se avecina? Pues estás de suerte, el equipo de Entity Framework ha lanzado la segunda alpha de la versión 6 de este potente framework. Desde hace unos días puedes descargarla desde NuGet. Como es una versión previa vas a tener que activar está opción en NuGet.

image

Pero yendo al grano, ¿Qué novedades nos puede aportar la nueva versión?

  • Realizar consultas Async siempre y cuando esté corriendo sobre .NET 4.5.
  • Con Custom conventions ahora podremos sobrescribir las convenciones por defecto que usa Code First para mapear tipos y propiedades en la base de datos.
  • Podemos realizar migraciones de la base de datos con más de un DbContext.
  • Podemos usar Enumerable.Contains en LINQ de forma mucho más eficiente con EF.
  • Todas las mejoras de EF6 excepto Async están disponibles tanto en .NET 4 y .NET 4.5.
  • Nuevas contribuciones de la comunidad gracias a que EF fue lanzado recientemente bajo una licencia open source Apache.

Como vemos son bastantes las novedades que nos proponen, vamos a profundizar un poco más en alguna de ellas.

 

 

Soporte para Async

El nuevo .NET 4.5 introduce un nuevo formato para realizar tareas asíncronas de forma potente y sencilla gracias a Async/Await. Con EF6 y .NET 4.5 ahora podremos hacer uso de esta potente herramienta. Esto es perfecto para aplicaciones ASP.NET, ya que ahora podremos procesar las llamadas a la base de datos de forma asíncrona, evitando bloquear un hilo mientras la base de datos realiza la consulta. Esto incrementa la escalabilidad del servidor permitiendo procesar más peticiones mientras esperamos una respuesta de la base de datos.

    public class HomeController : Controller
    {
        LocationContext db = new LocationContext();
 
        public async Task<ActionResult> Index()
        {
            var locations = await db.Locations.ToListAsync();
 
            return View(locations);
        }
    }

SI miramos el código anterior podemos ver que ahora tenemos el método ToListAsync que nos permite realizar la consulta de forma asíncrona. Pero tenemos que poner la palabra reservada await antes de llamar al método. De esta forma una vez el código hace la petición a la base de datos el thread deja de estar bloqueado esperando, para volver al thread pool, para que pueda procesar otra petición mientras. De esta forma el servidor puede procesar más peticiones de forma concurrente y aprovechar mejor los recursos.

Si deseas conocer más acerca de esta nueva funcionalidad puedes mirar el siguiente enlace.

 

Custom Conventions

Cuando usamos Code First automáticamente EF mapea nuestro modelo a tablas, usando unos convenios predeterminados en EF. Por ejemplo, cualquier propiedad del modelo que termine por “ID” es reconocida como clave primaria.

Ahora con EF6 podemos definir nosotros nuestras propias convenciones que sobrescriban las predeterminadas, como por ejemplo que en vez de “ID” las propiedades que queremos que sean clave primaria termine en “KEY”. De forma que podamos elegir las convenciones que mejor encajen en nuestro proyecto.

Con el siguiente código podremos establecer la precisión de los decimales a 5. Esto lo haremos, como otras configuraciones de Code First, en el método OnModelCreating:

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Properties<decimal>()
                .Configure(x => x.HasPrecision(5));
        }

Pero aún podemos ir más lejos, y definir por ejemplo que no todos los decimales tengan precisión 5, sino que solo aquellas propiedades que tengan un nombre especial o lo que nosotros necesitemos.

En este enlace puedes ver mas ejemplos de usos de Custom Conventions.

 

Aportaciones de la comunidad

Desde que EF se lanzara con licencia open source, varios miembros de la comunidad han realizado aportaciones y alguna de ellas se han incluido en EF6 Alpha 2. Con mucho orgullo os hablamos de esta nueva parte de EF ya que una de las contribuciones ha sido realizada por un desarrollador español, Unai Zorrilla. Su contribución ha sido la primera característica nueva realizada por la comunidad para Entity Framework.

La aportación de Unai nos permitirá cargar todas las clases de configuración de Code First desde un ensamblado con una sola llamada a un método como podemos ver a continuación.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{ 
       modelBuilder.Configurations 
           .AddFromAssembly(typeof(LocationContext).Assembly);
}

Con este método buscará y cargará todas las clases que hereden de EntityTypeConfiguration<T> or ComplexTypeConfiguration<T>  en el ensamblado donde esté definido LocationContext. Así reducimos el acoplamiento entre el contexto y las clases de configuración.

Entre otras contribuciones podemos encontrar la de AlirezaHaghshenas que gracias a su aportación se ha incrementado el rendimiento del arranque de EF para grandes modelos mejorando el rendimiento de generación de la vista. El cambio implica que será menos necesario usar vistas pre-generadas.

Desde el equipo de MSDN nos gustaría dar la enhorabuena y las gracias a Unai, no solo por ayudar a tener una herramienta mejor y más potente, sino además por demostrar que en la comunidad de desarrolladores tenemos mucho talento para ofrecer.

 

Futuras características de EF 6

Desde la página web de Entity Framework en Codeplex podemos encontrar más información. Además en este roadmap podemos ver las siguientes características que se incluirán en las futuras versiones de EF 6.

Una de estas características que se incluirán en las próximas versiones de EF 6 será la posibilidad de mapear stored procedures para consultas y actualizaciones sobre entidades usando Code First. Yo ya estoy deseando probarla ¿Y tú?

 

Conclusiones

Entity Framework 6 es la primera versión con licencia open source Apache de este framework, y como vemos abre muchas puertas que seguro nos aportará funcionalidad nueva. Si quieres probar esta versión Alpha 2, puedes descargarla de NuGet.

 

¡Un saludo!

Adrián Fernández (@tracker086)