Comment Entity Framework fonctionne-t-il avec les hiérarchies récursives? Include () semble ne pas fonctionner avec

c# entity-framework visual-studio-2008

Question

J'ai un Item . Item a une Category .

Category a ID , Name , Parent et Children . Parent et les Children sont aussi de la Category .

Lorsque je fais une requête LINQ to Entities pour un Item spécifique, il ne renvoie pas la Category associée, sauf si j'utilise la méthode Include("Category") . Mais il n'apporte pas la catégorie complète, avec ses parents et ses enfants. Je pourrais faire Include("Category.Parent") , mais cet objet ressemble à un arbre, j'ai une hiérarchie récursive et je ne sais pas où il se termine.

Comment puis-je faire en sorte que EF charge complètement la Category , avec les parents et les enfants, et les parents avec leurs parents et leurs enfants, etc.?

Ce n'est pas quelque chose pour toute l'application, pour des considérations de performances, il ne serait nécessaire que pour cette entité spécifique, la catégorie.

Réponse acceptée

Au lieu d'utiliser la méthode Include , vous pouvez utiliser Load .

Vous pouvez ensuite en faire une pour chacun et parcourir tous les enfants en les chargeant. Ensuite, faites un pour chacun à travers leurs enfants, et ainsi de suite.

Le nombre de niveaux que vous allez descendre sera codé en dur dans le nombre de boucles que vous avez.

Voici un exemple d'utilisation de Load : http://msdn.microsoft.com/en-us/library/bb896249.aspx


Réponse populaire

Si vous voulez absolument que toute la hiérarchie soit chargée, alors si c'était mon cas, j'essaierais d'écrire une procédure stockée. Son rôle est de renvoyer tous les éléments d'une hiérarchie, en renvoyant celui que vous demandez en premier (et ses enfants par la suite).

Et ensuite, laissez la correction des relations avec EF s’assurer qu’elles sont toutes connectées.

c'est à dire quelque chose comme:

// the GetCategoryAndHierarchyById method is an enum
Category c = ctx.GetCategoryAndHierarchyById(1).ToList().First();

Si vous avez correctement écrit votre procédure stockée, la matérialisation de tous les éléments de la hiérarchie (c.-à-d. ToList() ) devrait permettre la correction de la relation EF.

Et ensuite, l'élément que vous voulez (First ()) doit avoir tous ses enfants chargés, ainsi que leurs enfants, etc. Tous doivent être renseignés à partir de cet appel de procédure stockée, donc aucun problème MARS non plus.

J'espère que cela t'aides

Alex



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow