2010-10-12 8 views
3

J'essaie d'interroger une seule entité dans une base de données avec un DataServiceQuery. L'entité que j'essaie de charger a des relations avec un graphique d'autres entités que je veux charger également. MSDN décrit here et here que je peux charger mes entités référencées en utilisant DataServiceQuery <TElement> .Expand ou DataServiceContext.LoadProperty.Comment charger des relations d'entités du second degré avec un service de données WCF?

Cela fonctionne très bien pour les relations de premier degré de mon entité, mais j'ai un problème pour charger les relations de relations. Il est évident que je pouvais appeler LoadProperty pour toutes les relations de second degré et faire une boucle dans toutes les collections de second degré, mais j'espérais pouvoir charger avec impatience le graphe de relations dans une seule requête. Est-ce possible?

Modifier

chargement En fait, les relations de deuxième degré est pas évident après tout. Le code suivant échoue (modèle de domaine a été modifié pour plus de clarté):

  var context = DataServiceReference.DataServiceContextFactory.Create(); 
      var customer = (from c in context.Customers.Expand("Orders") 
           where c.CustomerId.Equals(customerId) 
           select c).First(); 
      foreach (var order in customer.Orders) 
      { 
       context.LoadProperty(order, "Products"); 

La dernière ligne jette au-dessus InvalidOperationException: «Le contexte ne poursuit pas actuellement l'entité ». J'utilise des entités d'auto-suivi. Est-ce que cette erreur pourrait être liée à STE?

Comment charger les relations de second degré de quelque façon que ce soit?

Solution modifier

Il se trouve que DataServiceQuery <TElement> .Expand utilise une syntaxe de chemin différent par rapport à ObjectQuery <T> .include. Le premier utilise la barre oblique comme séparateur de trajectoire, le dernier utilise le point. Quelqu'un peut-il expliquer pourquoi la syntaxe est incohérente et où je peux trouver la documentation de la syntaxe du chemin Expand?

Répondre

5

DataServiceContextFactory est votre propre classe, n'est-ce pas? (puisque ce n'est pas comme ça que vous instanciez typiquement un DataServiceContext). En supposant que cela finisse par créer une instance DataServiceContext normale, le moyen de charger plusieurs niveaux est simplement de spécifier les multiples niveaux de votre appel Expand. Donc, par exemple: context.Customers.Expand ("Commandes/Produits") Vous rendrons tous les clients, leurs commandes et tous les produits pour ces commandes. Pour que LoadProperty fonctionne, assurez-vous que sur votre DataServiceContext, la propriété MergeOption est définie sur l'une des options permettant le suivi. Notez que le suivi côté client n'a rien à voir avec le suivi EF côté serveur (il s'agit d'un code distinct sur une machine séparée techniquement). Vous pouvez vérifier que le contexte suit l'entité en question en essayant d'appeler context.GetEntityDescriptor (myEntityInstance) Si elle renvoie non nul, le contexte suit l'entité et LoadProperty devrait fonctionner.

+0

Oui, la fabrique de contextes est simplement une classe de fabrique simple qui crée un contexte en utilisant l'URL correcte. Mon problème ici était que le chemin d'expansion utilise "/" Je suis habitué à Inclure qui utilise "." Sur le chemin. Quelle est l'explication de cette notation de chemin incohérente? – Holstebroe

+0

J'ai essayé d'ajouter la ligne context.MergeOption = MergeOption.OverwriteChanges; après avoir créé le contexte et avant de charger les entités, mais LoadProperty échoue toujours et context.GetEntityDescriptor (myEntityInstance) renvoie null. Comment puis-je activer correctement le suivi? – Holstebroe

+0

La syntaxe dans Expand est "héritée" de la syntaxe d'URL de $ expand. Dans l'URL, le/est utilisé pour séparer les navigations, car c'est la manière naturelle de naviguer dans les URL. –