9

Dans les contrôleurs générés par Visual Studio, ainsi que l'application de l'échantillon (ContosoUniversity), l'action Index a toujours quelque chose commeLe but de include() dans ASP.NET MVC + Entity Framework

var departments = db.Departments.Include(d => d.Administrator); 

Qu'est-ce la différence entre cela et

var departments = db.Departments; 

d'abord, je soupçonne que le premier (avec Include) permet à la vue de récupérer department.Administrator. Mais le second (sans inclure) semble être capable de faire cela aussi.

Répondre

13

Le Include indique Entity Framework de charger avec impatience l'administrateur pour chaque département dans les résultats. Dans ce cas, Entity Framework peut utiliser une jointure SQL pour récupérer les données des deux tables dans une seule requête.

Le code fonctionnera toujours sans inclure, mais la première fois que vous accéderez à l'administrateur d'un service, EF devra appuyer sur la base de données pour le charger (puisqu'il n'a pas été préchargé). Le chargement de données à la demande (paresseusement) est une fonctionnalité intéressante, mais cela peut être un sérieux problème de performance (connu sous le nom de problème N+1). Surtout si vous accédez à l'administrateur pour chaque département (par exemple, dans une boucle) - au lieu d'un appel de base de données, vous finirez avec beaucoup!

+0

Je ne sais pas si je l'ai compris correctement. Avec Include, EF utilisera join pour saisir les deux départements et leurs administrateurs dans une seule requête. Sans inclure, EF n'attrapera que les départements et récupérera ses administrateurs à la demande? Donc, si je n'ai besoin que d'un ou deux administrateurs dans les ministères, je ne devrais pas utiliser Inclure. Mais si j'ai besoin de l'administrateur de tous (ou de la plupart) des ministères, je devrais utiliser Inclure. – Jim

+1

Exactement, l'inclusion force les administrateurs à être chargés dans la même requête qui charge les départements. Sans l'inclusion, les administrateurs sont chargés un à la fois sur demande. –

+0

@Jim, spécifiquement, puisque vous utilisez ASP.NET MVC, vous ne voulez pas que vos vues pour contacter la base de données. Et pour 'departments.First(). Administrator' travailler sans accès à la base,' Administrator' doit être pré-chargé à l'aide 'Include'. – bzlm

1
var departments = db.Departments; 

Cette volonté récupère les domaines globaux que si LazyLoadingEnabled est activé & MultipleActiveResultSets est à true dans la chaîne de connexion.

+0

Merci pour la réponse. J'ai voté et j'ai souhaité marquer plusieurs réponses. – Jim

2

Dans le premier cas (avec Include) lorsque vous écrivez department.Administrator serveurs l'objet de la mémoire qui a été ardemment chargé en raison de la méthode Include. Dans le second cas, une instruction sql sera exécutée pour extraire l'enregistrement Administrator de la base de données pour chaque objet département.

+0

Merci pour la réponse. J'ai voté et j'ai souhaité marquer plusieurs réponses. – Jim

Questions connexes