Entity Framework - Désireux de chargement entités liées
Je suis en utilisant Entity Framework 4 avec MVC et la nécessité de s'assurer que toutes les entités référencées, que je veux utiliser mon point de vue, ont été chargé avant que le contrôleur méthode retourne, sinon la vue crache le redouté:
ObjectContext instance a été éliminé et ne peut plus être utilisé pour les opérations qui nécessitent une connexion.
Lors de la sélection de droite, d'après le contexte, je peux utiliser le Include(string)
méthode pour les forcer à être inclus dans le SQL généré la requête:
var sellers = context.Sellers.Include("Recommendations.User").ToList();
Cependant, si j'ai (par exemple) une méthode d'assistance qui accepte une entité et les besoins de tous les éléments à charger, il n'y a pas Include
méthode disponible.
void Test(Seller seller)
{
//ensure all recommendations and their users are loaded
}
L'approche par force brute consiste à parcourir en boucle:
foreach (var recommendation in seller.Recommendations)
recommendation.User.ToString(); //just force a load
Si j'ai 100 recommandations, cela va créer 101 requêtes SQL derrière-le-scènes. Idéalement, je veux une méthode/approche qui charge toutes les Recommendation
ET User
objets avec seulement un seul voyage à SQL.
Montrez-moi l'argent.
MODIFIER je ne suis pas vraiment intéressé à la question de savoir si c'est une bonne ou une mauvaise architecture. J'ai simplifié mon scénario pour le bien de la question. Pouvez-vous faire ce que je demande, avec l'objectif EF API?
EDIT 2
Ladislav d'édition offert de l'espoir d'une nouvelle approche, mais il semble que je ne suis pas tout à fait là.
Je peux réaliser ce que je veux via ce:
context.Sellers.Include("Recommendations.User").Single(s => s.Id == seller.Id);
Cette approche ne fonctionne pas à l'aide de LoadProperty
...
context.LoadProperty(seller, "Recommendations.User");
...comme il échoue avec l'erreur...
Spécifié propriété de navigation Recommandations.L'utilisateur n'a pas pu être trouvé.
Aucune de ces deux approches de travail si vous n'avez pas de référence au contexte.
OriginalL'auteur Drew Noakes | 2010-09-08
Vous devez vous connecter pour publier un commentaire.
C'est une vieille question, mais dans EF6 vous pouvez effectuer le chargement des objets dépendants sur une entité comme cette:
Qui serait de charger tous
Recommendations
et de leursUsers
pour leseller
OriginalL'auteur DMac the Destroyer
Je pense que c'est un travail à votre référentiel qui doit, dans votre cas, exposer des méthodes comme GetFullSeller (toutes les propriétés chargé de l') et GetSeller (seule entité de base).
Edit:
Il y a plusieurs façons de charger les propriétés de navigation en EF v4.
Il n'y a pas de chargement automatique.
OriginalL'auteur Ladislav Mrnka
Je suis dans la même situation. Je pense qu'avec EF est très facile de tomber dans une 101 requête problème.
Une solution peut être de créer une classe partielle de votre Vendeur de classe (généré par EF) et de mettre en œuvre un GetSubclassNameQ que le retour d'un IQueryable, et un GetSubclassNameQFull que le retour d'un IQueryable avec impatient de chargement.
OriginalL'auteur Marco Staffoli
Plutôt que de passer votre domaine d'objets (
EntityObject
s) à la vue, vous pouvez utiliser votre contrôleur à la carte dans un Modèle objet qui représente mieux ce que votre vue devrait en fait être l'affichage. Cela permettra de réduire le montant de la logique nécessaires à votre avis, et d'avoir l'agréable effet secondaire d'éviter le passage de EntityObjects après leur contexte a expiré.Modifier basé sur votre edit:
Non, l'API n'ont pas les moyens de prendre une seule Entité de l'Objet et de faire toutes les autres entités de l'Objet de son type qui a été chargé en même temps, il était paresseux-rempli avec une propriété particulière d'un seul coup. Vous êtes mieux de tirer tous les éléments en premier lieu, à l'aide de la
Include
mentionner comme vous le montrez dans votre question.basé sur votre modifier 😉 ce n'est pas tout à fait ce que je veux faire. J'ai un vendeur. J'ai besoin de toutes les recommandations du vendeur pour être chargé. Sur chacune de ces recommandations, j'ai besoin de l'utilisateur correspondant à charger. Je n'ai pas besoin d'autres vendeurs à être chargé.
Si je pouvais inventer l'API, je dirais
seller.Load("Recommendations.User")
, tout comme je pourrais le faire dans l'entité d'origine de requête (comme dans OP.)Je comprends ce que tu veux dire, maintenant. Qui pourrait être assez utile. Malheureusement, le "comprennent" la fonctionnalité est très intrinsèquement liée à la
ObjectQuery<T>
objet (contexte.Les vendeurs), et il n'y a pas d'API pour permettre à ce que vous me demandez sur leEntityCollection<T>
objet (vendeur.Les recommandations).OriginalL'auteur StriplingWarrior