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.
Je pense qu'il est bon de catégoriser des relations comme celle-ci
Quand utiliser un chargement rapide
Quand utiliser le chargement paresseux
Note: comme Transcendent a déclaré qu'il pourrait y avoir un problème d'élimination avec le chargement paresseux.
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:
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:
REMARQUE: Entity Framework prend en charge trois méthodes de chargement de données associées: chargement rapide, chargement différé et chargement explicite.
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é.
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.
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.
// 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();
}