Nouvelles fonctionnalités d’EF Core 2.1New features in EF Core 2.1

En plus de nombreux correctifs de bogues et de petites améliorations des fonctionnalités et des performances, EF Core 2.1 inclut de nouvelles fonctionnalités intéressantes :Besides numerous bug fixes and small functional and performance enhancements, EF Core 2.1 includes some compelling new features:

Chargement différéLazy loading

EF Core contient désormais les blocs de construction nécessaires pour permettre à quiconque de créer des classes d’entité capables de charger leurs propriétés de navigation à la demande.EF Core now contains the necessary building blocks for anyone to author entity classes that can load their navigation properties on demand. Nous avons également introduit un nouveau package, Microsoft.EntityFrameworkCore.Proxies, qui tire parti de ces composants pour produire des classes proxy de chargement différé basées sur des classes d’entité ayant subi des modifications minimales (par exemple des classes avec des propriétés de navigation virtuelles).We have also created a new package, Microsoft.EntityFrameworkCore.Proxies, that leverages those building blocks to produce lazy loading proxy classes based on minimally modified entity classes (for example, classes with virtual navigation properties).

Pour plus d’informations sur cette rubrique, lisez la section sur le chargement différé.Read the section on lazy loading for more information about this topic.

Paramètres dans les constructeurs d’entitéParameters in entity constructors

L’un des blocs de construction nécessaires pour le chargement différé prend désormais en charge la création d’entités qui acceptent des paramètres dans leurs constructeurs.As one of the required building blocks for lazy loading, we enabled the creation of entities that take parameters in their constructors. Vous pouvez utiliser des paramètres pour injecter des valeurs de propriété, des délégués de chargement différé et des services.You can use parameters to inject property values, lazy loading delegates, and services.

Pour plus d’informations sur cette rubrique, lisez la section sur le constructeur d’entité avec des paramètres.Read the section on entity constructor with parameters for more information about this topic.

Conversions de valeursValue conversions

Jusqu’à présent, EF Core pouvait uniquement mapper les propriétés de types pris en charge nativement par le fournisseur de base de données sous-jacent.Until now, EF Core could only map properties of types natively supported by the underlying database provider. Les valeurs étaient copiées entre les colonnes et les propriétés sans aucune transformation.Values were copied back and forth between columns and properties without any transformation. À compter d’EF Core 2.1, les conversions de valeurs peuvent être appliquées pour transformer les valeurs obtenues à partir de colonnes avant leur application aux propriétés, et vice versa.Starting with EF Core 2.1, value conversions can be applied to transform the values obtained from columns before they are applied to properties, and vice versa. Nous avons un certain nombre de conversions qui peuvent être appliquées par convention, le cas échéant, ainsi qu’une API de configuration explicite qui permet d’inscrire des conversions personnalisées entre des colonnes et des propriétés.We have a number of conversions that can be applied by convention as necessary, as well as an explicit configuration API that allows registering custom conversions between columns and properties. Parmi les applications de cette fonctionnalité, citons les suivantes :Some of the application of this feature are:

  • Stockage des enums sous forme de chaînesStoring enums as strings
  • Mappage d’entiers non signés avec SQL ServerMapping unsigned integers with SQL Server
  • Chiffrement et déchiffrement automatiques des valeurs de propriétéAutomatic encryption and decryption of property values

Pour plus d’informations sur cette rubrique, lisez la section sur les conversions de valeurs.Read the section on value conversions for more information about this topic.

Traduction LINQ GroupByLINQ GroupBy translation

Avant la version 2.1, l’opérateur LINQ GroupBy dans EF Core était toujours évalué en mémoire.Before version 2.1, in EF Core the GroupBy LINQ operator would always be evaluated in memory. Il est désormais possible de le traduire en clause SQL GROUP BY dans les scénarios les plus courants.We now support translating it to the SQL GROUP BY clause in most common cases.

Cet exemple illustre une requête avec GroupBy utilisée pour calculer différentes fonctions d’agrégation :This example shows a query with GroupBy used to compute various aggregate functions:

var query = context.Orders
    .GroupBy(o => new { o.CustomerId, o.EmployeeId })
    .Select(g => new
        {
          g.Key.CustomerId,
          g.Key.EmployeeId,
          Sum = g.Sum(o => o.Amount),
          Min = g.Min(o => o.Amount),
          Max = g.Max(o => o.Amount),
          Avg = g.Average(o => Amount)
        });

La traduction SQL correspondante ressemble à ceci :The corresponding SQL translation looks like this:

SELECT [o].[CustomerId], [o].[EmployeeId],
    SUM([o].[Amount]), MIN([o].[Amount]), MAX([o].[Amount]), AVG([o].[Amount])
FROM [Orders] AS [o]
GROUP BY [o].[CustomerId], [o].[EmployeeId];

Amorçage des donnéesData Seeding

Avec la nouvelle version, il sera possible de fournir des données initiales pour remplir une base de données.With the new release it will be possible to provide initial data to populate a database. Contrairement à ce qui se passe dans EF6, l’amorçage des données est associé à un type d’entité dans le cadre de la configuration du modèle.Unlike in EF6, seeding data is associated to an entity type as part of the model configuration. Les migrations EF Core peuvent automatiquement calculer les opérations d’insertion, de mise à jour ou de suppression à appliquer au moment de la mise à niveau de la base de données vers une nouvelle version du modèle.Then EF Core migrations can automatically compute what insert, update or delete operations need to be applied when upgrading the database to a new version of the model.

Par exemple, utilisez ceci pour configurer les données d’amorçage d’un Post dans OnModelCreating:As an example, you can use this to configure seed data for a Post in OnModelCreating:

modelBuilder.Entity<Post>().HasData(new Post{ Id = 1, Text = "Hello World!" });

Pour plus d’informations sur cette rubrique, lisez la section sur l’amorçage des données.Read the section on data seeding for more information about this topic.

Types de requêtesQuery types

Un modèle EF Core peut désormais inclure des types de requêtes.An EF Core model can now include query types. Contrairement aux types d’entités, les types de requêtes ne sont pas associés à une définition de clé et ne peuvent pas être insérés, supprimés ou mis à jour (autrement dit, ils sont en lecture seule). Toutefois, ils peuvent être retournés directement par des requêtes.Unlike entity types, query types do not have keys defined on them and cannot be inserted, deleted or updated (that is, they are read-only), but they can be returned directly by queries. Voici quelques scénarios d’usages pour les types de requêtes :Some of the usage scenarios for query types are:

  • Mappage à des vues sans clés primairesMapping to views without primary keys
  • Mappage à des tables sans clés primairesMapping to tables without primary keys
  • Mappage à des requêtes définies dans le modèleMapping to queries defined in the model
  • Utilisation comme type de retour pour les requêtes FromSql()Serving as the return type for FromSql() queries

Pour plus d’informations sur cette rubrique, lisez la section sur les types de requêtes.Read the section on query types for more information about this topic.

Include pour les types dérivésInclude for derived types

Vous pouvez désormais spécifier des propriétés de navigation définies uniquement sur des types dérivés lors de l’écriture d’expressions pour la méthode Include.It will be now possible to specify navigation properties only defined on derived types when writing expressions for the Include method. Pour la version fortement typée de Include, nous prenons en charge l’utilisation d’un cast explicite ou de l’opérateur as.For the strongly typed version of Include, we support using either an explicit cast or the as operator. Nous prenons également en charge le référencement des noms de propriété de navigation définis sur des types dérivés dans la version chaîne de Include :We also now support referencing the names of navigation property defined on derived types in the string version of Include:

var option1 = context.People.Include(p => ((Student)p).School);
var option2 = context.People.Include(p => (p as Student).School);
var option3 = context.People.Include("School");

Pour plus d’informations sur cette rubrique, lisez la section sur Include avec des types dérivés.Read the section on Include with derived types for more information about this topic.

Prise en charge de System.TransactionsSystem.Transactions support

Vous pouvez désormais utiliser les fonctionnalités System.Transactions, notamment TransactionScope.We have added the ability to work with System.Transactions features such as TransactionScope. Celles-ci fonctionnent sur le .NET Framework et .NET Core avec des fournisseurs de base de données compatibles.This will work on both .NET Framework and .NET Core when using database providers that support it.

Pour plus d’informations sur cette rubrique, lisez la section sur System.Transactions.Read the section on System.Transactions for more information about this topic.

Meilleur classement des colonnes dans la migration initialeBetter column ordering in initial migration

Après avoir passé en revue les commentaires des clients, nous avons mis à jour les migrations de manière à générer initialement des colonnes pour les tables dans le même ordre que les propriétés déclarées dans les classes.Based on customer feedback, we have updated migrations to initially generate columns for tables in the same order as properties are declared in classes. Notez qu’EF Core ne peut pas changer l’ordre si de nouveaux membres sont ajoutés après la création de la table initiale.Note that EF Core cannot change order when new members are added after the initial table creation.

Optimisation des sous-requêtes corréléesOptimization of correlated subqueries

Nous avons amélioré la traduction des requêtes pour éviter l’exécution de requêtes SQL « N + 1 » dans de nombreux scénarios courants dans lesquels l’utilisation d’une propriété de navigation dans la projection débouche sur la jointure des données de la requête racine avec les données d’une sous-requête corrélée.We have improved our query translation to avoid executing "N + 1" SQL queries in many common scenarios in which the usage of a navigation property in the projection leads to joining data from the root query with data from a correlated subquery. L’optimisation nécessite la mise en mémoire tampon des résultats à partir de la sous-requête. Nous vous demandons par ailleurs de modifier la requête pour procéder à l’adhésion du nouveau comportement.The optimization requires buffering the results from the subquery, and we require that you modify the query to opt-in the new behavior.

Par exemple, la requête suivante est normalement traduite en une seule requête pour Customers, plus N requêtes séparées pour Orders (où « N » est le nombre de clients retournés) :As an example, the following query normally gets translated into one query for Customers, plus N (where "N" is the number of customers returned) separate queries for Orders:

var query = context.Customers.Select(
    c => c.Orders.Where(o => o.Amount  > 100).Select(o => o.Amount));

En incluant ToList() au bon endroit, vous indiquez que la mise en mémoire tampon est appropriée pour Orders, ce qui déclenche l’optimisation :By including ToList() in the right place, you indicate that buffering is appropriate for the Orders, which enable the optimization:

var query = context.Customers.Select(
    c => c.Orders.Where(o => o.Amount  > 100).Select(o => o.Amount).ToList());

Notez que cette requête est traduite en deux requêtes SQL seulement : une pour Customers et la suivante pour Orders.Note that this query will be translated to only two SQL queries: One for Customers and the next one for Orders.

Attribut [Owned][Owned] attribute

Il est désormais possible de configurer des types d’entités détenus en annotant simplement le type avec [Owned] et en veillant à ce que l’entité propriétaire soit ajoutée au modèle :It is now possible to configure owned entity types by simply annotating the type with [Owned] and then making sure the owner entity is added to the model:

[Owned]
public class StreetAddress
{
    public string Street { get; set; }
    public string City { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public StreetAddress ShippingAddress { get; set; }
}

Outil en ligne de commande dotnet-ef inclus dans le SDK .NET CoreCommand-line tool dotnet-ef included in .NET Core SDK

Les commandes ef-dotnet font désormais partie du SDK .NET Core. Ainsi, il n’est plus nécessaire d’utiliser DotNetCliToolReference dans le projet pour pouvoir utiliser des migrations ou structurer un DbContext à partir d’une base de données existante.The dotnet-ef commands are now part of the .NET Core SDK, therefore it will no longer be necessary to use DotNetCliToolReference in the project to be able to use migrations or to scaffold a DbContext from an existing database.

Pour plus d’informations sur la façon d’activer les outils en ligne de commande pour différentes versions du SDK .NET Core et EF Core, consultez la section sur l’installation des outils.See the section on installing the tools for more details on how to enable command line tools for different versions of the .NET Core SDK and EF Core.

Package Microsoft.EntityFrameworkCore.AbstractionsMicrosoft.EntityFrameworkCore.Abstractions package

Le nouveau package contient des attributs et des interfaces que vous pouvez utiliser dans vos projets pour alléger les fonctionnalités EF Core sans dépendance envers Core EF dans sa globalité.The new package contains attributes and interfaces that you can use in your projects to light up EF Core features without taking a dependency on EF Core as a whole. Par exemple, l’attribut [Owned] et l’interface ILazyLoader se trouvent ici.For example, the [Owned] attribute and the ILazyLoader interface are located here.

Événements de changement d’étatState change events

Les nouveaux événements Tracked et StateChanged sur ChangeTracker peuvent être utilisés pour écrire une logique qui réagit aux entités qui entrent dans DbContext ou modifiant leur état.New Tracked And StateChanged events on ChangeTracker can be used to write logic that reacts to entities entering the DbContext or changing their state.

Analyseur de paramètre SQL brutRaw SQL parameter analyzer

Un nouvel analyseur de code est inclus avec EF Core. Il détecte les utilisations potentiellement dangereuses de nos API SQL brutes, comme FromSql ou ExecuteSqlCommand.A new code analyzer is included with EF Core that detects potentially unsafe usages of our raw-SQL APIs, like FromSql or ExecuteSqlCommand. Par exemple, dans la requête suivante, un avertissement s’affiche, car minAge n’est pas paramétrable :For example, for the following query, you will see a warning because minAge is not parameterized:

var sql = $"SELECT * FROM People WHERE Age > {minAge}";
var query = context.People.FromSql(sql);

Compatibilité des fournisseurs de base de donnéesDatabase provider compatibility

Nous vous recommandons d’utiliser EF Core 2.1 avec des fournisseurs qui ont été mis à jour ou au moins testés pour fonctionner avec EF Core 2.1.It is recommended that you use EF Core 2.1 with providers that have been updated or at least tested to work with EF Core 2.1.

Conseil

Si vous vous heurtez à des incompatibilités inattendues ou à d’autres problèmes liés aux nouvelles fonctionnalités, ou si vous avez des commentaires à propos de ces nouveautés, utilisez notre système de suivi des problèmes pour nous en faire part.If you find any unexpected incompatibility or any issue in the new features, or if you have feedback on them, please report it using our issue tracker.