Sortie de Entity Framework Core 2.2. Quoi de neuf (3 sur 3)

Le 4 décembre, la version finale d'EF Core 2.2 est sortie. Il a été publié en parallèle avec ASP.NET Core 2.2 et .NET Core 2.2 et est la dernière version de notre technologie open source et multiplateforme pour la gestion des mappages entre les objets langage et une base de données.


EF Core 2.2 RTM contient plus d'une centaine de correctifs et plusieurs nouvelles fonctionnalités, dont nous parlerons dans cet article.


Les liens mènent aux articles correspondants sur Habré. Ceci est le dernier, troisième article de la série. La prochaine fois, nous parlerons d'une nouvelle version - et ce sera dans la nouvelle année.



Données spatiales


Les données spatiales sont utilisées pour stocker l'emplacement physique et la forme des objets. De nombreuses bases de données existantes ont des méthodes intégrées pour stocker, indexer et récupérer ces données. Les principaux scénarios d'utilisation sont la recherche d'objets à une distance sélectionnée et la vérification que certains des polygones contiennent un point donné. EF Core 2.2 pourra désormais travailler avec ces bases de données et géodonnées, en utilisant les types de la bibliothèque NetTopologySuite (NTS).


Les données spatiales sont implémentées sous forme d'ensembles de packages d'extension pour des fournisseurs spéciaux. Chacun de ces packages ajoute à la fois de nouveaux mappages pour les types et méthodes NTS et les types et fonctions spatiaux correspondants dans la base de données. De telles extensions de fournisseur ont déjà été implémentées pour SQL Server, SQLite et PostgreSQL (grâce au projet Npgsql). Les types spatiaux peuvent être utilisés directement, avec le fournisseur en mémoire EF Core, sans utiliser d'autres extensions.


Une fois l'extension installée, la prise en charge de nouveaux types est incluse. Les propriétés avec ces types peuvent être utilisées dans leurs entités, par exemple:


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

Bien sûr, vous pouvez maintenant enregistrer ces données:


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

De même, il devient possible de faire des requêtes à la base de données qui impliquent des données spatiales et des opérations:


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

Les données spatiales sont un grand sujet avec lequel vous devriez commencer par la documentation officielle .


Collections d'entités dépendantes


EF Core 2.0 introduit la possibilité de modéliser des relations un à un. EF Core 2.2 étend cette fonctionnalité avec la possibilité d'indiquer directement qui est à cet égard l'entité principale (propriétaire) et qui est dépendant (propriétaire). Cela vous permet de limiter et de clarifier la portée de l'entité.


Par exemple, les entités dépendantes:


  • Ils ne peuvent être utilisés que dans les propriétés de référence ( «propriété de navigation» en anglais ) contenues dans d'autres types d'entités;
  • DbContext et suivi automatiquement dans DbContext uniquement avec son entité principale.

Dans les bases de données relationnelles, les collections dépendantes ne sont pas affichées dans la table de l'entité principale, mais dans des tables distinctes, similaires aux relations un à plusieurs habituelles. Dans les bases de données orientées document, tout est quelque peu différent, et nous prévoyons d'incorporer des entités dépendantes (dans des collections ou des liens dépendants) dans le même document dans lequel l'entité principale est stockée.


Vous pouvez utiliser la fonctionnalité en appelant la nouvelle API OwnsMany() :


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

Pour plus d'informations, reportez-vous à la documentation .


Balises de requête


Cette fonctionnalité est destinée à simplifier la tâche de recherche d'une connexion entre les requêtes LINQ dans le code et les requêtes SQL générées à partir de celles-ci, qui peuvent être trouvées dans les journaux.


Pour activer les balises, annotez la requête LINQ à l'aide de la nouvelle méthode TagWith() . Modifions un peu l'exemple précédent de la section des données spatiales:


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

Vous pouvez voir le texte suivant dans le journal:


 -- 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 

Comme toujours, il y a une [section dans la documentation] à ce sujet.


Compatible avec EF Core 2.1


Nous avons passé beaucoup de temps et d'efforts à assurer la compatibilité descendante d'EF Core 2.2 avec les fournisseurs existants d'EF Core 2.1 et à faire en sorte qu'après la mise à jour vers EF Core 2.2, l'application soit assemblée sans problèmes visibles. Dans la plupart des cas, la migration vers la nouvelle version sera très simple, mais néanmoins, si vous rencontrez soudainement des problèmes, cela vaut la peine d'en parler dans notre bugtracker .


Pour le moment, une seule modification peut nécessiter de petites modifications du code d'application. Vous pouvez le lire dans la description du ticket suivant:


  • # 13986 : Un type configuré à la fois en tant que propriété régulière et en tant que propriété dépendante, nécessite la création d'une clé primaire immédiatement après la mise à niveau de 2.1 vers 2.2.

Nous avons l'intention de continuer à maintenir et à mettre à jour la liste des problèmes nécessitant une modification de l'ancien code.


Et ensuite: EF Core 3.0


Après la sortie de la version 2.2, notre prochain objectif est EF Core 3.0. Nous n'avons pas encore implémenté de nouvelles fonctionnalités, donc les packages NuGet publiés le 4 décembre ne contiennent que quelques petites modifications apportées après la sortie d'EF Core 2.2.


Il y a déjà plusieurs grandes idées largement discutées prévues pour la prochaine version. Nous voulons en parler dans les prochains communiqués de presse, mais voici quelques sujets sur lesquels vous pouvez déjà dire quelque chose:


  • Améliorations de LINQ . LINQ vous permet d'écrire des requêtes de base de données sans avoir à basculer de votre langue principale vers la langue de la base de données, en utilisant les informations de type pour afficher IntelliSense et valider au moment de la compilation. Mais cela signifie également que LINQ vous permet d'écrire un nombre illimité de requêtes complexes, ce qui a toujours été un véritable défi pour les fournisseurs de LINQ. Dans les premières versions d'EF Core, nous avons résolu ce problème en déterminant quelles parties de la demande pouvaient être traduites en SQL, puis en permettant au reste de la demande d'être exécuté directement sur le client, en utilisant la mémoire de ce client. Cette exécution côté client peut parfois être utile, mais dans de nombreux cas, elle conduit à des requêtes extrêmement inefficaces qui ne peuvent être trouvées tant que le code n'est pas entré en production. EF Core 3.0 veut faire un travail approfondi de modification des internes LINQ et comment les tester. Il est nécessaire de les rendre plus durables et fiables (par exemple, afin que les demandes ne se cassent pas après le lancement de nouvelles versions de correctifs); implémenter la traduction correcte en SQL d'un plus grand nombre d'expressions; se concentrer sur la génération de requêtes qui fonctionneront plus efficacement dans plus de cas; considérer que les demandes inefficaces ne passent pas inaperçues.


  • Prise en charge de Cosmos DB . Nous continuons de travailler sur le fournisseur Cosmos DB pour EF Core afin que les développeurs familiarisés avec le modèle de programmation EF puissent immédiatement cibler Azure Cosmos DB comme base principale. Le défi consiste à tirer le meilleur parti de Cosmos DB, comme la distribution mondiale, la disponibilité «toujours active», l'évolutivité élastique, la faible latence, etc. Le fournisseur EF Core devrait fournir la plupart des fonctionnalités disponibles. Nous avons commencé à le faire bien avant EF Core 2.2 et avons même publié quelques versions préliminaires . Nous continuerons à développer le fournisseur en parallèle avec EF Core 3.0.


  • Prise en charge de C # 8.0 . C # 8.0 possède de nouvelles fonctionnalités utiles comme les flux asynchrones (y compris await foreach ) et les types de référence nullables pris en charge par EF Core.


  • Inverser une base de données en types de requête . EF Core 2.1 ajoute la prise en charge des types de requête qui représentent des données qui peuvent être lues à partir de la base de données mais ne peuvent pas être mises à jour. Ils sont parfaits pour modéliser des vues dans des bases de données SQL, et EF Core 3.0 souhaite donc automatiser leur création.


  • Entités de sac de propriété . Cela ajoute des entités qui stockent des données non pas dans des propriétés ordinaires, mais dans des propriétés indexées, et peuvent utiliser des instances de la même classe dans .NET (par exemple, quelque chose comme Dictionary<string, object> ) pour afficher de nombreux types d'entités différents en un et le même modèle EF Core. Cette fonctionnalité est la prochaine étape sur la voie vers des relations à plusieurs à part entière sans l'utilisation d'entités unificatrices - c'est-à-dire l'une des fonctionnalités les plus attendues d'EF Core.


  • EF 6.3 sur .NET Core . Il est clair qu'il existe maintenant de nombreuses applications qui utilisent EF, et les porter sur EF Core juste pour obtenir certains avantages de l'utilisation de .NET Core nécessite parfois beaucoup d'efforts. Par conséquent, nous adapterons la prochaine version d'EF 6 afin qu'elle commence également à fonctionner sur .NET Core 3.0. Il s'agit d'encourager les développeurs à porter leurs applications afin qu'ils doivent modifier le moins de code possible. Bien sûr, cela entraînera un certain nombre de limitations (par exemple, de nouveaux fournisseurs seront nécessaires et la prise en charge des données spatiales ne sera pas activée pour SQL Server). De plus, nous ne prévoyons pas d'ajouter de fonctionnalités supplémentaires à EF 6.



Conclusion


L'équipe EF remercie la communauté pour le feedback de qualité et l'aide au développement qui ont finalement conduit à l'introduction d'EF Core 2.2. Comme toujours, nous vous rappelons que de nouveaux ishshui peuvent être ajoutés directement à notre tracker . Je vous remercie!


N'oubliez pas que les billets pour DotNext à partir du 1er janvier augmenteront de prix. Personnel - pour mille, et Standard - pour deux mille. Les détails sur Early Bird sont sur le site .

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


All Articles