0

Je souhaite créer un graphique d'objet à l'aide d'Entity Framework 4.2.EF4 Obtention d'associations dans des requêtes distinctes lors de l'utilisation de POCO

À l'heure actuelle, j'ai des entités POCO, en utilisant ICollection pour les propriétés de navigation. Je veux éviter d'utiliser EntityCollection ou quoi que ce soit d'autre EF.

Je souhaite éviter les jointures massives provoquées par l'utilisation excessive d'Include. Étant donné un objet, je veux remplir ses propriétés de navigation, résultant en une requête de base de données séparée.

Existe-t-il un moyen de remplir une ICollection directement? En ce moment, je travaille sur le problème, mais c'est vraiment douloureux.

// grab the user, brand users and brands 
User user = entities.Users 
        .Include(item => item.BrandUsers.Select(brandUser => brandUser.Brand)) 
        .Where(item => item.Name == userName) 
        .SingleOrDefault(); 
// grab the pending share grants and brands 
entities.Users 
     .Include(item => item.ToShareGrants.Select(shareGrant => shareGrant.Brand)) 
     .Where(item => item.Id == user.Id) 
     .Load(); 
return user; 

Une chose que je n'aime pas cette approche est que je suis re-interroger l'objet de niveau supérieur. Si je ne fais pas cela, la propriété de navigation n'est pas remplie (left NULL) quand aucun objet n'est retourné. Par exemple, le code suivant seulement fonctionne que si les résultats sont retournés:

entities.ShareGrants 
     .Include(item => item.Brand) 
     .Where(item => item.ToUserId == user.Id) 
     .Load(); 

J'étais curieux de savoir s'il y avait juste une méthode que je ne connaissais pas dans le cadre de l'entité pour la construction de ces types de relations. Si quelqu'un connaît une approche facile pour remplir les propriétés de navigation par étapes, j'apprécierais un échantillon de code.

Répondre

0

La réponse courte à cette question est que EF4 ne supporte pas directement la fonctionnalité que je voulais. Afin d'éviter une jointure massive et de répartir les résultats entre plusieurs appels à la base de données, l'entité la plus haute doit être téléchargée à nouveau dans la base de données. Cela signifie que les colonnes les plus à gauche de l'ensemble de résultats seront les colonnes de cette entité répétées pour chaque enregistrement.

0

Essayez désactiver le chargement paresseux pour votre requête en cours, vous pouvez simplement mettre cela dans un bloc en utilisant

entities.ContextOptions.LazyLoadingEnabled = false; 
+0

J'ai un chargement paresseux et la génération de proxy est désactivée. Il semble qu'Inclus est le seul moyen de remplir les propriétés de navigation. Ce que je recherche est un moyen de charger explicitement les propriétés de navigation (via une requête de base de données). –

0

Votre question n'est pas très claire. Pourquoi ne pas utiliser plusieurs Include s dans la même requête

User user = entities.Users 
     .Include(item => item.BrandUsers.Select(brandUser => brandUser.Brand)) 
     .Include(item => item.ToShareGrants.Select(shareGrant => shareGrant.Brand)) 
     .Where(item => item.Name == userName) 
     .SingleOrDefault(); 
+0

Si j'utilise plusieurs inclusions, cela peut provoquer une jointure massive. En outre, je peux conditionnellement construire différentes parties du graphe d'objet, en fonction de ce qui est nécessaire. –

+0

@TravisParks Si vous ne les chargez pas d'avance, le chargement de chaque propriété de navigation émettra une requête de base de données. Chaque approche a son compromis, choisissez ce qui est le mieux pour chaque cas. – Eranga

+0

Je veux un hit de base de données, dans mon scénario. –

Questions connexes