Entity Framework Core 3.0: ¿qué novedades nos trae?

Tiempo de lectura: 4 minutos
La imagen muestra el logo de Entity Framework Core

Hace unas semanas desde que se hizo pública la versión 3.0 de .Net Core y nos ha traído muchas novedades: C# 8, soporte ampliado en Windows, mejoras de rendimiento, Worker Services… Y como no, también nos trae una nueva versión de Entity Framework Core.

Son muchas las novedades que nos trae esta nueva release, que nos aportan mejoras de rendimiento, pero también cambios en el diseño. En esta entrada vamos a ver algunas de las características más importantes de esta nueva versión, aunque te recomiendo que le eches un ojo a la lista completa de cambios que trae Entity Framework Core 3.0 (y también a la lista de breaking changes).

Instrucción SQL única por consulta LINQ

Se ha mejorado el motor de generación de sentencias SQL, anteriormente, consultas que hiciésemos con varias tablas, podían llevar a ejecutar varias consultas a la base de datos en vez de una sola (que es lo que esperamos al utilizarlo). Entity Framework Core 3.0 garantiza que solo se va a generar una única consulta que lanzar a la base de datos, y en caso de no poder traducirse a una única consulta, nos lanzara una excepción que nos lo va a indicar para que podamos refactorizar el código.

Restricción de la evaluación en cliente

En versiones anteriores, si una consulta no se podía traducir a SQL, se realizaba lo que se conoce como evaluación en cliente. Esto significa que se iba a lanzar a la base de datos una consulta con los máximos filtros posibles aplicados, y los que no se pueden traducir, se aplicaban en el propio cliente, a costa de traerse los datos en bruto y procesarlos en nuestra aplicación. Imagina este código (obtenido de la documentación oficial):

public static string StandardizeUrl(string url)
{
    url = url.ToLower();
    if (!url.StartsWith("http://"))
    {
        url = string.Concat("http://", url);
    }
    return url;
}

var blogs = context.Blogs
    .Where(blog => blog.Date > DateTime.Now.AddYears(-1) StandardizeUrl(blog.Url).Contains("dotnet"))
    .ToList();

Estamos utilizando una condición que la base de datos no puede ejecutar, por lo que el comportamiento va a ser:

  1. Hacemos una consulta que nos devuelve toda la tabla filtrada por fecha.
  2. Filtramos en memoria toda la tabla para aplicar nuestra condición personalizada.
  3. Generamos una lista con los resultados filtrados

Aunque esto a veces puede ser útil, si la tabla se hace grande va a ser una gran perdida de rendimiento. Por defecto, en versiones anteriores se permitía la consulta y se indicaba un warning. Este comportamiento por defecto a cambiado en Entity Framework Core 3.0, ahora va a lanzar una excepción que nos lo va a indicar. Si queremos hacer la evaluación en cliente, tenemos que hacerlo de forma explicita:

var blogs = context.Blogs
    .Where(blog => blog.Date > DateTime.Now.AddYears(-1))
    .AsEnumerable() //Cambiamos a Linq de objetos
    .Where(blog => StandardizeUrl(blog.Url).Contains("dotnet"))
    .ToList();

Compatibilidad con C# 8

La nueva versión de C# nos trae muchas mejoras y nuevas APIs, y entre ellas IAsyncEnumerable, lo que junto a «await foreach», nos va a permitir mejorar la velocidad a la que se ejecutan las consultas, ya que vamos a ir procesando los datos a medida que están disponibles. Gracias a C# en Entity Framework Core 3.0 podemos hacer algo como esto:

var orders = 
  from o in context.Orders
  where o.Status == OrderStatus.Pending
  select o;

//Cada nuevo nuevo dato obtenido los vamos a procesar inmediatamente
await foreach(var o in orders.AsAsyncEnumerable())
{
    Process(o);
} 

El tooling de Entity Framework Core 3.0 ya no forma parte de .Net Core 3.0

Un cambio de diseño importante es que .Net Core ya no trae integrado el set de herramientas para trabajar con Entity Framework Core. Es decir, vamos a necesitar instalar a parte el set de herramientas si realmente nos interesa usarlo. Esto lo podemos hacer de manera local con el archivo de manifiesto de herramientas o de manera global con el comando:

dotnet tool install --global dotnet-ef

Esta desarrollado para .Net Standard 2.1

Esta nueva versión de Entity Framework Core, está desarrollado cumpliendo con .Net Standard 2.1, esto es lo que le permite tener grandes mejoras de rendimiento, pero limita las plataformas donde se puede utilizar, .Net Core 3.0 es compatible con .Net Standard 2.1, pero .Net Framework no es compatible, por lo qué si necesitas usarlo en .Net Framework, no vas a poder utilizar Entity Framework Core 3.0.

Y un largo etcétera…

La verdad es que no se limitan a esto los cambios que nos ofrece esta nueva versión. Yo he querido resaltar los que a mi parecer son los más importantes o necesarios tener en cuenta si vienes de trabajar con versiones anteriores, pero te recomiendo encarecidamente que le eches un ojo a las nuevas características y sobre todo, a la lista de cambios que no son retrocompatibles. Verás que esta es una nueva versión muy interesante y con muchas mejoras.

Deja un comentario