web-dev-qa-db-fra.com

Lazy Loading vs Eager Loading

Le chargement différé dans Entity Framework est le phénomène par défaut qui se produit pour charger et accéder aux entités associées. Cependant, on parle de chargement avec empressement à la pratique du chargement par la force de toutes ces relations. Je suis tombé sur la question de savoir dans quelle situation un chargement rapide pourrait être plus bénéfique qu'un chargement paresseux. En posant cette question, il est évident que le chargement paresseux est plus respectueux des ressources, et même si nous utilisons la méthode ToList(), nous pouvons toujours tirer parti du comportement de chargement paresseux. Cependant, je pensais que le chargement paresseux augmentait le nombre de requêtes dans la base de données. C'est peut-être pourquoi les développeurs utilisent parfois la méthode Inlcude pour forcer le chargement de toutes les relations. Par exemple, lors de l'utilisation de l'échafaudage automatique Visual Studio dans MVC 5, la méthode Index automatiquement créée dans le contrôleur utilise toujours le chargement Eager, et je me suis toujours demandé pourquoi Microsoft utilisait le chargement Eager par défaut dans ce cas.

J'apprécierais que quelqu'un m'explique dans quelle situation un chargement rapide serait plus bénéfique qu'un chargement paresseux, et pourquoi l'utilisions-nous alors qu'il y a quelque chose de plus convivial comme le chargement paresseux.

60
Arrrr

Je pense qu'il est bon de catégoriser des relations comme celle-ci

Quand utiliser un chargement rapide

  1. Dans "un côté" des relations un-à-plusieurs que vous êtes certainement utilisé partout où avec une entité principale. comme propriété de l'utilisateur d'un article. Propriété de catégorie d'un produit.
  2. En règle générale, lorsque les relations ne sont pas trop nombreuses et que le chargement est rapide, il est recommandé de réduire les requêtes supplémentaires sur le serveur.

Quand utiliser le chargement paresseux

  1. Presque de chaque "côté collection" des relations un-à-plusieurs. comme des articles d'utilisateur ou des produits d'une catégorie
  2. Vous savez exactement que vous n'aurez pas besoin d'une propriété instantanément.

Note: comme Transcendent a déclaré qu'il pourrait y avoir un problème d'élimination avec le chargement paresseux.

62
farid bekran

Eager Loading: Eager Loading vous aide à charger toutes les entités dont vous avez besoin en même temps. c'est-à-dire que les objets associés (objets enfants) sont chargés automatiquement avec son objet parent.

Quand utiliser:

  1. Utilisez Eager Loading lorsque les relations ne sont pas trop. Eager Loading est donc une bonne pratique pour réduire le nombre de requêtes supplémentaires sur le serveur.
  2. Utilisez Eager Loading lorsque vous êtes certain d’utiliser des entités associées avec l’entité principale partout.

Chargement paresseux: En cas de chargement paresseux, les objets associés (objets enfants) ne sont pas chargés automatiquement avec son objet parent tant qu'ils ne sont pas demandés. Par défaut, LINQ prend en charge le chargement différé.

Quand utiliser:

  1. Utilisez le chargement différé lorsque vous utilisez des collections un à plusieurs.
  2. Utilisez Chargement paresseux lorsque vous êtes certain de ne pas utiliser les entités associées instantanément.

REMARQUE: Entity Framework prend en charge trois méthodes de chargement de données associées: chargement rapide, chargement différé et chargement explicite.

17
Dark Matter

Le chargement différé produira plusieurs appels SQL tandis que le chargement d'Eager peut charger des données avec un appel "plus lourd" (avec jointures/sous-requêtes).

Par exemple, s'il y a un ping élevé entre votre serveur Web et vos serveurs SQL, le chargement d'Eager est préférable au chargement des éléments associés 1 à 1 avec un chargement différé.

16
serhiyb

Considérez la situation ci-dessous

public class Person{
    public String Name{get; set;}
    public String Email {get; set;}
    public virtual Employer employer {get; set;}
}

public List<EF.Person> GetPerson(){
    using(EF.DbEntities db = new EF.DbEntities()){
       return db.Person.ToList();
    }
}

Maintenant, après l'appel de cette méthode, vous ne pouvez plus charger paresseux l'entité Employer. Pourquoi? parce que l'objet db est supprimé. Donc, vous devez faire Person.Include(x=> x.employer) pour forcer le chargement.

10
Transcendent

Eager Loading Lorsque vous êtes sûr de vouloir obtenir plusieurs entités à la fois, par exemple, vous devez afficher les informations de l'utilisateur et les informations de l'utilisateur sur la même page, vous devez alors choisir un chargement rapide. Un chargement rapide rend la base de données unique et charge les entités associées.

Chargement paresseux Lorsque vous devez afficher les utilisateurs uniquement sur la page, et en cliquant sur les utilisateurs, vous devez afficher les détails de l'utilisateur, puis vous devez procéder au chargement paresseux. Le chargement différé génère plusieurs occurrences pour charger les entités associées lorsque vous les liez/itérerez.

3
Sheriff
// Using LINQ and just referencing p.Employer will lazy load
// I am not at a computer but I know I have lazy loaded in one
// query with a single query call like below.
List<Person> persons = new List<Person>();
using(MyDbContext dbContext = new MyDbContext())
{
    persons = (
        from p in dbcontext.Persons
        select new Person{
            Name = p.Name,
            Email = p.Email,
            Employer = p.Employer
        }).ToList();
}
0
Matt Empringham