Entity Framework Core 2.2 lanzado. Que hay de nuevo (3 de 3)

El 4 de diciembre, se lanzó la versión final de EF Core 2.2. Fue lanzado en paralelo con ASP.NET Core 2.2 y .NET Core 2.2 y es la última versión de nuestra tecnología de código abierto y multiplataforma para administrar asignaciones entre objetos de lenguaje y una base de datos.


EF Core 2.2 RTM contiene más de cien correcciones y varias características nuevas, de las que hablaremos en este artículo.


Los enlaces conducen a los artículos correspondientes sobre Habré. Este es el último, tercer artículo de la serie. La próxima vez hablaremos sobre un nuevo lanzamiento, y será en el nuevo año.



Datos espaciales


Los datos espaciales se utilizan para almacenar la ubicación física y la forma de los objetos. Muchas bases de datos existentes tienen formas integradas de almacenar, indexar y buscar dichos datos. Los escenarios de uso principales son buscar objetos a una distancia seleccionada y verificar que algunos de los polígonos contengan un punto dado. EF Core 2.2 ahora podrá trabajar con dichas bases de datos y geodatos en ellas, utilizando tipos de la biblioteca NetTopologySuite (NTS).


Los datos espaciales se implementan como conjuntos de paquetes de extensión para proveedores especiales. Cada uno de estos paquetes agrega nuevas asignaciones para los tipos y métodos de NTS, y los tipos y funciones espaciales correspondientes en la base de datos. Dichas extensiones de proveedor ya se han implementado para SQL Server, SQLite y PostgreSQL (gracias al proyecto Npgsql). Los tipos espaciales se pueden usar directamente, junto con el proveedor de memoria EF Core, sin usar ninguna otra extensión.


Una vez instalada la extensión, se incluye soporte para nuevos tipos. Las propiedades con estos tipos se pueden usar en sus entidades, por ejemplo:


using NetTopologySuite.Geometries; namespace MyApp { public class Friend { [Key] public string Name { get; set; } [Required] public Point Location { get; set; } } } 

Por supuesto, ahora puede guardar estos datos:


 using (var context = new MyDbContext()) { context.Add( new Friend { Name = "Bill", Location = new Point(-122.34877, 47.6233355) {SRID = 4326 } }); context.SaveChanges(); } 

Del mismo modo, es posible realizar consultas a la base de datos que involucren datos y operaciones espaciales:


  var nearestFriends = (from f in context.Friends orderby f.Location.Distance(myLocation) descending select f).Take(5).ToList(); 

Los datos espaciales son un gran tema con el que debe comenzar con la documentación oficial .


Colecciones de entidades dependientes


EF Core 2.0 presenta la capacidad de modelar relaciones uno a uno. EF Core 2.2 amplía esta característica con la capacidad de indicar directamente quién es a este respecto la entidad principal (propietario) y quién es dependiente (propiedad). Esto le permite limitar y aclarar el alcance de la entidad.


Por ejemplo, entidades dependientes:


  • Solo se pueden usar en propiedades de referencia ( "propiedad de navegación" en inglés ) contenidas en otros tipos de entidades;
  • Cargado y rastreado automáticamente en DbContext solo junto con su entidad principal.

En las bases de datos relacionales, las colecciones dependientes no se muestran en la tabla de la entidad principal, sino en tablas separadas, similares a las relaciones habituales de uno a muchos. En las bases de datos orientadas a documentos, todo es algo diferente, y planeamos incrustar entidades dependientes (en colecciones o enlaces dependientes) en el mismo documento en el que se almacena la entidad principal.


Puede usar la función llamando a la nueva API OwnsMany() :


 modelBuilder.Entity<Customer>().OwnsMany(c => c.Addresses); 

Para más información, consulte la documentación .


Etiquetas de consulta


Esta característica está destinada a simplificar la tarea de encontrar una conexión entre las consultas LINQ en el código y las consultas SQL generadas a partir de ellas, que se pueden encontrar en los registros.


Para habilitar las etiquetas, anote la consulta LINQ utilizando el nuevo método TagWith() . Modifiquemos un poco el ejemplo anterior de la sección de datos espaciales:


  var nearestFriends = (from f in context.Friends.TagWith(@"This is my spatial query!") orderby f.Location.Distance(myLocation) descending select f).Take(5).ToList(); 

Puede ver el siguiente texto en el registro:


 -- This is my spatial query! SELECT TOP(@__p_1) [f].[Name], [f].[Location] FROM [Friends] AS [f] ORDER BY [f].[Location].STDistance(@__myLocation_0) DESC 

Como siempre, hay una [sección en la documentación] sobre esto.


Compatible con EF Core 2.1


Dedicamos mucho tiempo y esfuerzo a garantizar la compatibilidad con versiones anteriores de EF Core 2.2 con los proveedores existentes de EF Core 2.1 y lograr que, después de actualizar a EF Core 2.2, la aplicación se ensamblara sin problemas visibles. Lo más probable es que, en la mayoría de los casos, la migración a la nueva versión sea simple, pero sin embargo, si de repente encuentra problemas, vale la pena hablar de ellos en nuestro rastreador de errores .


Por el momento, solo hay un cambio que puede requerir pequeños cambios en el código de la aplicación. Puede leer sobre esto en la descripción del siguiente boleto:


  • # 13986 : Un tipo configurado como propiedad regular y como dependiente, requiere la creación de una clave primaria inmediatamente después de la actualización de 2.1 a 2.2.

Tenemos la intención de continuar manteniendo y actualizando la lista de problemas que requieren la modificación del código anterior.


Lo que sigue: EF Core 3.0


Después del lanzamiento de la versión 2.2, nuestro próximo objetivo es EF Core 3.0. Todavía no hemos implementado ninguna característica nueva, por lo que los paquetes NuGet lanzados el 4 de diciembre contienen solo algunos pequeños cambios realizados después del lanzamiento de EF Core 2.2.


Ya hay varias grandes ideas ampliamente discutidas planeadas para el próximo lanzamiento. Queremos hablar sobre ellos en futuros comunicados de prensa, pero aquí hay algunos temas sobre los cuales ya puede decir algo:


  • Mejoras en LINQ . LINQ le permite escribir consultas en la base de datos sin tener que cambiar de su idioma principal al idioma de la base de datos, utilizando información de tipo para mostrar IntelliSense y validar en tiempo de compilación. Pero esto también significa que LINQ le permite escribir un número ilimitado de consultas complejas, que siempre han sido un verdadero desafío para los proveedores de LINQ. En las primeras versiones de EF Core, resolvimos este problema determinando qué partes de la solicitud se pueden traducir a SQL, y luego permitiendo que el resto de la solicitud se ejecute directamente en el cliente, utilizando la memoria de este cliente. Esta ejecución del lado del cliente a veces puede ser útil, pero en muchos casos conduce a solicitudes extremadamente ineficientes que no se pueden encontrar hasta que el código entre en producción. EF Core 3.0 quiere hacer un trabajo minucioso para cambiar los componentes internos de LINQ y cómo probarlos. Es necesario hacerlos más duraderos y confiables (por ejemplo, para que las solicitudes no se rompan después de lanzar nuevas versiones de parches); implementar la traducción correcta en SQL de un mayor número de expresiones; centrarse en generar consultas que funcionarán de manera más eficiente en más casos; considerar que las solicitudes ineficientes no pasan desapercibidas.


  • Soporte Cosmos DB . Continuamos trabajando en el proveedor de Cosmos DB para EF Core para que los desarrolladores familiarizados con el modelo de programación de EF puedan apuntar inmediatamente a Azure Cosmos DB como su base principal. El desafío es aprovechar lo mejor de Cosmos DB, como distribución global, disponibilidad "siempre activa", escalabilidad elástica, baja latencia, etc. El proveedor de EF Core debe proporcionar la mayoría de las funciones disponibles. Comenzamos a hacer esto mucho antes de EF Core 2.2 e incluso lanzamos algunas versiones preliminares . Continuaremos desarrollando el proveedor en paralelo con EF Core 3.0.


  • Soporte para C # 8.0 . C # 8.0 tiene algunas características nuevas y útiles , como las secuencias asíncronas (incluida la await foreach ) y los tipos de referencia anulables admitidos por EF Core.


  • Invertir una base de datos en tipos de consulta . EF Core 2.1 agrega soporte para tipos de consulta que representan datos que pueden leerse desde la base de datos pero que no pueden actualizarse. Son excelentes para modelar vistas en bases de datos SQL, por lo que EF Core 3.0 quiere automatizar su creación.


  • Entidades de bolsa de propiedades . Esto agrega entidades que almacenan datos no en propiedades ordinarias, sino en índices, y pueden usar instancias de la misma clase en .NET (por ejemplo, algo como Dictionary<string, object> ) para mostrar muchos tipos diferentes de entidades en una y el mismo modelo EF Core. Esta característica es el siguiente paso en el camino hacia relaciones de muchos a muchos sin el uso de entidades unificadoras, es decir, una de las características más esperadas de EF Core.


  • EF 6.3 en .NET Core . Está claro que ahora hay muchas aplicaciones que usan EF, y portarlas a EF Core solo para obtener algunos beneficios de usar .NET Core a veces requiere mucho esfuerzo. Por lo tanto, adaptaremos la próxima versión de EF 6 para que también comience a funcionar en .NET Core 3.0. Esto es para alentar a los desarrolladores a portar sus aplicaciones para que tengan que cambiar la menor cantidad de código posible. Por supuesto, esto causará una serie de limitaciones (por ejemplo, se requerirán nuevos proveedores y el soporte de datos espaciales no estará habilitado para SQL Server). Además, no planeamos agregar características adicionales a EF 6.



Conclusión


El equipo de EF agradece a la comunidad por los comentarios de calidad y la asistencia para el desarrollo que finalmente condujeron a la introducción de EF Core 2.2. Como siempre, le recordamos que se puede agregar nuevo ishshui directamente a nuestro rastreador . Gracias


No olvide que las entradas para DotNext a partir del 1 de enero subirán de precio. Personal, por mil, y Estándar, por dos mil. Los detalles sobre Early Bird están en el sitio .

Source: https://habr.com/ru/post/es433442/


All Articles