Entity Framework Core 8

Par:
fredericmazue

mar, 14/03/2023 - 12:51

Entity Framework Core 8.0 (EF8) est la prochaine version après EF Core 7.0. Sa sortie est prévue en novembre 2023. Une préversion est toutefois accessible sur nuget.org. Les aperçus EF8 ciblent actuellement .NET 6 et peuvent donc être utilisés avec .NET 6 (LTS) ou .NET 7. Il y a de fortes chances que EF8 soit modifié pour cibler .NET 8 avant sa sortie. EF8 apportera beaucoup de nouveautés. En voici quelques unes.

Améliorations apportées à la prise en charge des colonnes JSON

EF8 inclut des améliorations de la prise en charge du mappage de colonnes JSON introduite dans EF7. Par exemple, la requête suivante, écrite en C#, vérifie si les deux premières mises à jour ont été effectuées avant une date donnée.

var cutoff = DateOnly.FromDateTime(DateTime.UtcNow - TimeSpan.FromDays(365));
var updatedPosts = await context.Posts
    .Where(
        p => p.Metadata!.Updates[0].UpdatedOn < cutoff
             && p.Metadata!.Updates[1].UpdatedOn < cutoff)
    .ToListAsync();

Cela se traduit par le SQL suivant lors de l'utilisation de SQL Server

SELECT [p].[Id], [p].[Archived], [p].[AuthorId], [p].[BlogId], [p].[Content], [p].[Discriminator], [p].[PublishedOn], [p].[Title], [p].[PromoText], [p].[Metadata]
FROM [Posts] AS [p]
WHERE CAST(JSON_VALUE([p].[Metadata],'$.Updates[0].UpdatedOn') AS date) < @__cutoff_0
  AND CAST(JSON_VALUE([p].[Metadata],'$.Updates[1].UpdatedOn') AS date) < @__cutoff_0

Requêtes SQL brutes pour les types non mappés

EF7 a introduit des requêtes SQL brutes renvoyant des types scalaires. Ceci est amélioré dans EF8 pour inclure des requêtes SQL brutes renvoyant tout type CLR mappable, sans inclure ce type dans le modèle EF. Les requêtes utilisant des types non mappés sont exécutées à l'aide de SqlQuery ou SqlQueryRaw .

Chargement différé pour les requêtes sans suivi

EF8 ajoute la prise en charge du chargement différé (ou chargement paresseux) des navigations sur les entités qui ne sont pas suivies par DbContext. Cela signifie qu'une requête sans suivi peut être suivie d'un chargement différé des navigations sur les entités renvoyées par la requête sans suivi.

Par exemple

var blogs = await context.Blogs.AsNoTracking().ToListAsync();

S Blog.Posts est configuré pour le chargement différé, par exemple, à l'aide de proxys de chargement différé, l'accès à Posts entraînera son chargement à partir de la base de données :

Console.WriteLine();
Console.Write("Choose a blog: ");
if (int.TryParse(ReadLine(), out var blogId))
{
    Console.WriteLine("Posts:");
    foreach (var post in blogs[blogId - 1].Posts)
    {
        Console.WriteLine($"  {post.Title}");
    }

EF8 indique également si une navigation donnée est chargée ou non pour les entités non suivies par le contexte. Par exemple:

foreach (var blog in blogs)
{
    if (context.Entry(blog).Collection(e => e.Posts).IsLoaded)
    {
        Console.WriteLine($" Posts for blog '{blog.Name}' are loaded.");
    }
}