Partager via


Nouveautés d’EF Core 10

EF Core 10 (EF10) est la prochaine version après EF Core 9 et est prévue pour la publication en novembre 2025.

EF10 est disponible en préversion. Pour obtenir des informations sur la dernière version, consultez les notes de publication de .NET 10. Cet article sera mis à jour à mesure que de nouvelles versions préliminaires sont mises à disposition.

Conseil

Vous pouvez exécuter et déboguer les exemples en téléchargeant l'exemple de code depuis GitHub. Chaque section ci-dessous est liée au code source spécifique à cette section.

EF10 nécessite le SDK .NET 10 pour générer et le runtime .NET 10 pour s'exécuter. EF10 ne s’exécute pas sur les versions antérieures de .NET et ne s’exécute pas sur .NET Framework.

Conseil

Les nouveaux documents sont mis à jour pour chaque préversion. Tous les exemples sont configurés pour utiliser les versions quotidiennes EF10, qui disposent généralement de plusieurs semaines supplémentaires de travail terminé par rapport à la dernière version préliminaire. Nous encourageons vivement l'utilisation des versions quotidiennes lors de tester de nouvelles fonctionnalités afin de ne pas travailler avec des versions obsolètes.

Traduction LINQ et SQL

Autres améliorations des requêtes

  • Traduction de DateOnly.ToDateTime(timeOnly) (#35194, contribuée par @mseada94).
  • Optimisation de plusieurs occurrences consécutives LIMIT (#35384), contribuée par @ranma42.
  • Optimisation de l’utilisation de l’opération de Count sur ICollection<T> (#35381), contribuée par @ChrisJollyAU).

ExecuteUpdateAsync accepte désormais une lambda régulière, non basée sur une expression

Le ExecuteUpdateAsync peut être utilisé pour exprimer des opérations de mise à jour arbitraires dans la base de données. Dans les versions précédentes, les modifications à effectuer sur les lignes de base de données ont été fournies via un paramètre d’arborescence d’expressions ; cela a fait qu’il est assez difficile de générer ces modifications dynamiquement. Par exemple, supposons que nous voulons mettre à jour les vues d’un blog, mais également son nom de manière conditionnelle. Étant donné que l’argument setters était une arborescence d’expressions, le code tel que le suivant devait être écrit :

// Base setters - update the Views only
Expression<Func<SetPropertyCalls<Blog>, SetPropertyCalls<Blog>>> setters =
    s => s.SetProperty(b => b.Views, 8);

// Conditionally add SetProperty(b => b.Name, "foo") to setters, based on the value of nameChanged
if (nameChanged)
{
    var blogParameter = Expression.Parameter(typeof(Blog), "b");

    setters = Expression.Lambda<Func<SetPropertyCalls<Blog>, SetPropertyCalls<Blog>>>(
        Expression.Call(
            instance: setters.Body,
            methodName: nameof(SetPropertyCalls<Blog>.SetProperty),
            typeArguments: [typeof(string)],
            arguments:
            [
                Expression.Lambda<Func<Blog, string>>(Expression.Property(blogParameter, nameof(Blog.Name)), blogParameter),
                Expression.Constant("foo")
            ]),
        setters.Parameters);
}

await context.Blogs.ExecuteUpdateAsync(setters);

La création manuelle d’arborescences d’expressions est complexe et sujette aux erreurs et rend ce scénario courant beaucoup plus difficile qu’il ne l’aurait dû être. À compter d’EF 10, vous pouvez maintenant écrire les éléments suivants à la place :

await context.Blogs.ExecuteUpdateAsync(s =>
{
    s.SetProperty(b => b.Views, 8);
    if (nameChanged)
    {
        s.SetProperty(b => b.Name, "foo");
    }
});

Merci à @aradalvand pour proposer et pousser pour ce changement (dans #32018).