10
votes

Frame-entité 3.5 - Comment charger des enfants

Mes questions sont probablement très simples, comment chargez-vous les enfants / sous-classes. Il n'y a pas de "charge" ou quoi que ce soit de ce que je peux trouver pour avoir le contexte charger les enfants.

La classe de contexte est de type ObjectContext, voir ci-dessous: P>

public partial class RTIPricingEntities : global::System.Data.Objects.ObjectContext


1 commentaires

Voici un exemple de la manière dont je charge les données: peut-être que j'aurais dû mentionner que je codifie cela pour une application Silverlight. Et c'est à travers un domaines-service. RtipricingContext _Context = nouveau rtipricingContext (); LOADOPERATION OP = _CONTEXT.LOAD (context.getPurchaseOrdercery (), ServionnaireLoadCallback, NULL); PRIVÉE PRISHERPORDERSPARDERSLOWERDCALLBACK (LOADOPERATION LO) {IEnumerable PO = LO.ENTITES.Où (W => w.Userid == SELECTELLEER.ID); // C'est la collection que j'ai besoin de remplir les sous-classes.


4 Réponses :


16
votes

Vous pouvez accabler la charge: xxx

... ou projet: xxx

L'avantage de la projection est que vous obtenez uniquement les données Vous avez besoin, pas de l'ensemble de chaque entité référencée. L'avantage du chargement avide est que les entités renvoyées changent de suivi. Choisissez la technique appropriée pour le problème à la main.

update

oui, il est important de mentionner que vous utilisez que vous utilisez RIA Services. Je présume que vous travaillez également auprès du client. Cela fait des choses complètement différents.

dans les services RIA, il est très important de vous assurer de retourner l'ensemble du graphe des entités souhaitées dans la charge initiale. Vous ne voulez pas appeler quelque chose comme .charger () sur une entité, car ce serait une autre chaude au serveur, ce qui est mauvais pour la performance. Si vous êtes dans, par exemple, un client Silverlight et demander une liste d'instances à partir du serveur et que leurs propriétés associées ne sont pas déjà matérialisées, il est déjà trop tard. En outre, inclure ne fonctionnera pas dans un client Silverlight. Par conséquent, les services RIA disposent d'outils côté serveur que vous pouvez utiliser pour vous assurer de renvoyer le graphique d'objet approprié et entièrement matérialisé initialement.

Ce que vous devez faire à la place est utilisé à la place. Vous pouvez créer une classe de métadonnées «Buddy» pour décorer votre modèle d'entité avec [Inclure]. Il existe des exemples dans Les services RIA Document de vue d'ensemble, section 4.8 .


2 commentaires

Bonjour, je ne sais pas si nous avons la même version, mais aucune option n'est possible lorsque je le codise. Il n'y a pas de ".include" disponible, seulement "intersect" .. IM en utilisant des entités dérivées d'entitéFramework qui a "ObjectContext" comme classe de base .. Et quand je projet, il n'y a pas de propriétés dans IntelliSense pour moi.


Inclure est une méthode d'objetQuisery , pas iquérissable . Alors vérifiez le type de référence que vous avez. Les entités ne tirent pas d'objetContext, ils dérivent de l'entitéObject. Dans mon exemple, il n'y aura pas d'intellisense sur l'objet projeté parce que j'ai utilisé un type anonyme . Si j'avais utilisé un type non anonyme, il y aurait Intellisense.



3
votes

Vous pouvez utiliser le Inclure () méthode de la System.Data.ObjectS.ObjectQuery . Cette méthode spécifie les objets associés à inclure dans les résultats de la requête et les appels à inclure () peuvent être chaînés ensemble pour charger plusieurs objets associés.

Par exemple, pour charger ModifiedByUser et la catégorie Vous utiliseriez une requête comme celle-ci: P>

var q = from p in context.Products
              .Include("ModifiedByUser")
              .Include("Category.ModifiedByUser") 
        select p;


1 commentaires

Je vois cette solution un peu, alors je dois faire quelque chose de totalement différent de tout le monde. Fondamentalement, j'utilise le contexte du DataModel générant par l'entitéFramework. J'ai les derniers de .net. Il n'y a pas de "inclus" disponible. Utilisez-vous DBML / Linq dans cet exemple? Je pense que c'est pourquoi ses différences ...



8
votes

Utilisation du .include () code> Comme beaucoup d'autres ont suggéré est un excellent moyen de réaliser ce dont vous avez besoin.

Cependant, vous devriez parfois "recharger" quelque chose plus tard sur cela Vous n'avez pas "inclus" ou que vous n'avez parfois besoin que parfois, ce que l'instruction inclure peut être un gaspillage de cycles informatiques dans de nombreux cas. p>

dans le cas d'une relation singulière comme "produit.category" (Où Product.Category est votre propriété de navigation du produit à la catégorie), vous disposez probablement d'un élément "produit.categoryReference". Vous pouvez vérifier que pour voir si elle est chargée ou non, et sinon, vous pouvez le charger "à la demande": p> xxx pré>

maintenant votre "catégorie" de référence doit être en mémoire. et prêt à être utilisé. p>

Si vous avez une propriété de navigation qui fait référence à une collection de choses (par exemple, "parties" pour un produit), vous pouvez faire la même chose, directement sur la propriété de navigation: p>

if(!Product.Parts.IsLoaded)
{
    Product.Parts.Load();
}


1 commentaires

Merci à tout le monde, j'ai compris que la raison pour laquelle je n'ai pas été en mesure de mettre en œuvre les nombreuses solutions proposées est que le contexte est différent une fois converti par le service de domaine pour Silverlight. Dans le code derrière le modèle de données-cadre d'entité, je peux implémenter toutes vos solutions et je viens de découvrir cela. Mais grâce à votre aide, je savais que la question devait être que je cherchais au mauvais endroit ...



0
votes

J'ai remarqué que la solution mentionnée ci-dessus par Craig ne charge pas à la fois le modifiéByUser et la catégorie. Il ne charge que la dernière collection d'objets qui dans ce cas est "catégorie". xxx

Toutefois, si vous échangez la commande, pour le faire .include ("catégorie"). Inclure ("ModifiedByUser") , puis ModifiedByUser est chargé. La chose bizarre est que la propriété ischargée de la collection d'objets affichera "true", mais le compte de la première collection d'objets sera toujours zéro. Je ne sais pas pourquoi c'est le cas.


0 commentaires