La façon la plus simple d’utiliser le chargement différé est d’installer le package Microsoft.EntityFrameworkCore.Proxies et de l’activer avec un appel à UseLazyLoadingProxies. Par exemple :
.AddDbContext<BloggingContext>(
b => b.UseLazyLoadingProxies()
.UseSqlServer(myConnectionString));
EF Core active ensuite le chargement différé pour n’importe quelle propriété de navigation qui peut être substituée, c’est-à-dire qui doit être virtual et sur une classe qui peut être héritée. Par exemple, dans les entités suivantes, les propriétés de navigation Post.Blog et Blog.Posts seront chargées en différé.
public class Blog
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public virtual Blog Blog { get; set; }
}
Avertissement
Le chargement différé peut entraîner des allers-retours supplémentaires sur la base de données (le problème appelé N + 1). vous devez donc veiller à éviter cela. Pour plus de détails, consultez la section performance.
Chargement différé sans proxy
Le chargement différé sans proxy fonctionnent en injectant le service ILazyLoader dans une entité, comme décrit dans Constructeurs de type d’entité. Par exemple :
public class Blog
{
private ICollection<Post> _posts;
public Blog()
{
}
private Blog(ILazyLoader lazyLoader)
{
LazyLoader = lazyLoader;
}
private ILazyLoader LazyLoader { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Post> Posts
{
get => LazyLoader.Load(this, ref _posts);
set => _posts = value;
}
}
public class Post
{
private Blog _blog;
public Post()
{
}
private Post(ILazyLoader lazyLoader)
{
LazyLoader = lazyLoader;
}
private ILazyLoader LazyLoader { get; set; }
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public Blog Blog
{
get => LazyLoader.Load(this, ref _blog);
set => _blog = value;
}
}
Cette méthode n’est pas nécessaire que l’héritage des types d’entité à partir des propriétés de navigation soit virtuel, et cela permet aux instances d’entité créées avec new d’être chargées en différé une fois jointes à un contexte. Toutefois, il requiert une référence au service ILazyLoader, qui est défini dans le package Microsoft.EntityFrameworkCore.Abstractions. Ce package contient un ensemble minimal de types, de sorte que dépendre de celui-ci n’a qu’un impact limité. Toutefois, pour éviter complètement de dépendre des packages EF Core dans les types d’entité, il est possible d’injecter la méthode ILazyLoader.Load en tant que délégué. Par exemple :
public class Blog
{
private ICollection<Post> _posts;
public Blog()
{
}
private Blog(Action<object, string> lazyLoader)
{
LazyLoader = lazyLoader;
}
private Action<object, string> LazyLoader { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Post> Posts
{
get => LazyLoader.Load(this, ref _posts);
set => _posts = value;
}
}
public class Post
{
private Blog _blog;
public Post()
{
}
private Post(Action<object, string> lazyLoader)
{
LazyLoader = lazyLoader;
}
private Action<object, string> LazyLoader { get; set; }
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public Blog Blog
{
get => LazyLoader.Load(this, ref _blog);
set => _blog = value;
}
}
Le code ci-dessus utilise une méthode d'extension Load pour rendre l’utilisation du délégué un peu plus propre :
public static class PocoLoadingExtensions
{
public static TRelated Load<TRelated>(
this Action<object, string> loader,
object entity,
ref TRelated navigationField,
[CallerMemberName] string navigationName = null)
where TRelated : class
{
loader?.Invoke(entity, navigationName);
return navigationField;
}
}
Notes
Le paramètre de constructeur pour le délégué à chargement différé doit être appelé « lazyLoader ». La configuration permettant d’utiliser un nom différent est prévue pour une version ultérieure.
Collaborer avec nous sur GitHub
La source de ce contenu se trouve sur GitHub, où vous pouvez également créer et examiner les problèmes et les demandes de tirage. Pour plus d’informations, consultez notre guide du contributeur.
Commentaires sur .NET
.NET est un projet open source. Sélectionnez un lien pour fournir des commentaires :
Ce module vous guide tout au long des étapes de création d’un projet d’accès aux données. Vous vous connectez à une base de données relationnelle et créez, lisez, mettez à jour et supprimez des requêtes (CRUD) à l’aide d’Entity Framework Core (EF Core).