Entity Framework - quelle est la différence entre l'utilisation d'Inclure/impatient de chargement et le chargement paresseux?
J'ai essayé de me familiariser avec l'Entity Framework. La plupart, il semble simple, mais je suis un peu confus sur la différence entre désireux de chargement avec la méthode include et par défaut au chargement différé. Les deux semblent comme ils chargent des entités liées, de sorte que sur la surface, on dirait qu'ils font la même chose. Ce qui me manque?
Vous devez vous connecter pour publier un commentaire.
Disons que vous avez deux entités avec un un-à-plusieurs relations à la Clientèle, et de l'Ordre, où chaque Client peut avoir plusieurs Commandes.
Lors du chargement d'une entité Client, Entity Framework permet de vous désireux de charge ou charge paresseux des Ordres du Client, de la collecte. Si vous choisissez avides de charger les Commandes de la collection, lorsque vous récupérez un Client de la base de données Entity Framework de génération SQL qui récupère les deux l'information du Client et les Commandes de ce Client dans une seule requête. Toutefois, si vous choisissez de chargement différé des Commandes de la collection, lorsque vous récupérez un Client de la base de données Entity Framework va générer du code SQL seulement tire l'information du Client (Entity Framework génère ensuite une distinct instruction SQL si vous accédez à des Ordres du Client, la collection plus tard dans votre code).
Déterminer quand utiliser impatient de chargement et quand utiliser le chargement paresseux, tout se résume à ce que vous vous attendez à voir avec les entités que vous récupérez. Si vous savez vous seulement besoin d'une information du Client, alors vous devriez paresseux-charger les Commandes de la collection (de sorte que la requête SQL peut être efficace que par la récupération de l'information du Client). A l'inverse, si vous savez que vous aurez besoin de parcourir par le biais d'un Client Commandes, alors vous devriez désireux charge les Commandes (si vous vous éviterez une base de données frapper une fois que vous avez accès des Ordres du Client dans votre code).
P. S. Être très prudent lors de l'utilisation de chargement différé car il peut conduire à la (N+1 problème. Par exemple, disons que vous avez une page qui affiche une liste de Clients et de leurs Commandes. Cependant, vous décidez d'utiliser le chargement différé lors de l'extraction de la Commande. Lorsque vous effectuer une itération sur les Clients de la collection, puis sur les Commandes de chaque Client, vous devrez effectuer une base de données de succès pour chaque Client afin de lazy-load dans leurs Commandes de la collection. Cela signifie que, pour N clients, vous aurez en N+1 de la base de données de hits (1 base de données a frappé à la charge de tous les Clients, alors N base de données atteint pour charger chacun de leurs Ordres) au lieu de tout juste 1 de la base de données frappé aviez-vous utilisé désireux de chargement (ce qui aurait récupéré tous les Clients et leurs Commandes dans une seule requête).
Si vous venez à partir de SQL monde pense à se JOINDRE.
Si vous devez afficher dans une grille de 10 commandes et de la clientèle que de mettre de l'ordre, vous avez 2 choix:
1) LAZY LOAD ( = 11 queryes = RALENTIR les PERFORMANCES)
EF seront tiré une requête pour récupérer les commandes et une requête pour chaque commande pour récupérer les données du client.
1) DÉSIREUX de CHARGE ( = 1 query = HAUTES PERFORMANCES)
EF seront tiré une seule requête pour récupérer les commandes et les clients avec une JOINTURE.
PS:
Lorsque vous récupérez un objet à partir de la db, l'objet est stocké dans un cache, alors que le contexte est active.
Dans l'exemple que j'ai fait avec le LAZY LOAD, si toutes les 10 commandes se rapportent à la même clientèle vous verrez seulement 2 requête parce que lorsque vous demandez à EF pour récupérer un objet à l'EF de vérifier si l'objet est dans le cache, et s'il trouve, il ne se déclenchera pas une autre requête SQL à la base de données.
Désireux de chargement est destiné à résoudre le N+1 Selects problème endémique de l'Orm. La version courte: Si vous allez directement à récupérer un certain nombre d'entités et vous savez que vous allez être d'accéder à certaines entités liées par l'extrait d'entités, il est beaucoup plus efficace pour récupérer toutes les entités associées à l'avant en un seul passage, par rapport à récupérer progressivement via le chargement paresseux.
Une question importante est la sérialisation. Microsoft recommande de ne PAS utiliser la valeur par défaut de chargement différé si vous travaillez avec des objets sérialisés. La sérialisation des causes de TOUTES les propriétés liées à être appelé, qui peut démarrer une réaction en chaîne des entités liées, d'être interrogé. Cela vient vraiment en jeu si vous êtes de retour des données JSON à partir d'un contrôleur. Les données JSON est évidemment sérialisé. Vous auriez souhaitez renvoyer des données immédiatement par l'intermédiaire Désireux ou tournez le lazyloading off dans le contexte et emploient Explicite chargement Paresseux.