2009-11-18 5 views
2

Lors de la création d'une requête avec EF, Normalement, nous allons créer un type anonyme afin de limiter le nombre de colonnes retournées.Entity Framework: comment peupler partiellement une entité

Mais le type anonyme ne peut pas être retourné ou utilisé comme un paramètre à un appel de méthode, ce qui signifie que tous les travaux liés à cet objet anonyme devrait être fait à l'intérieur d'une seule méthode. C'est vraiment mauvais.

Et certainement, nous ne voulons pas créer des types explicites juste pour représenter un sous-ensemble d'une entité existante.

À mon point de vue, nous jouons toujours avec l'envie entité existante (comme personne), mais dans différents scénarios, nous nous soucions seulement de certaines propriétés. Donc, je crois que le meilleur moyen est de peupler partiellement une entité. Mais il semble que Linq 2 EF ne le supporte pas.

Des suggestions?

Merci

+1

"Et certainement, nous ne voulons pas créer des types explicites juste pour représenter un sous-ensemble d'une entité existante." Pour moi, cela se lit comme, "Je préfère ne pas le faire * juste. *" –

Répondre

1
And certainly, we don't want to create explicit types just to represent a subset of an existing entity. 

Je ne pense pas qu'il existe un moyen de contourner ce problème. Si votre modèle de domaine a un petit ensemble de propriétés que les types générés par EF, utilisez simplement LINQ pour projeter le modèle EF dans votre modèle de domaine. Ce n'est pas si grave, car vous ne comptez pas directement sur le modèle ET, et il est plus facile de faire TDD.

+0

Il y a un moyen: http://blogs.msdn.com/alexj/archive/2009/04/25/tip-15- how-to-avoid-loading-inutile-properties.aspx Mais je préfère généralement matérialiser les modèles de présentation de POCO plutôt que partiellement peuplés, les «entités de pseudo». –

+0

Je suppose que vous avez raison. Le mappage à un modèle de domaine est le seul moyen. Mais avec les modèles POCO dans EF CTP, vous n'avez plus votre modèle EF, seulement le modèle POCO. Ce qui signifie que je dois faire quelque chose comme ceci: var anonymousPersons = ctx.Persons.Select (p => nouveau {p.Name, p.Phone}). ToList(); var partialPersons = anonymousPersons.Select (p => nouvelle personne {Name = p.Name, p.Phone}); Et Craig, penses-tu que c'est la meilleure façon de le faire? Merci –

+1

Craig a une belle présentation sur ce sujet, regardez-le, c'est très bien. http://blogs.teamb.com/craigstuntz/2009/09/11/38394/ –

1

Non spécifique à EF (et nous n'avons pas utilisé EF), mais j'ai souvent utilisé ce que nous appelons types « digérer ». Ceux-ci contenaient des informations de clé primaire et un sous-ensemble d'autres informations vitales, mais étaient en lecture seule et pouvaient être utilisés pour construire une entité complète. Nous avons également utilisé le chargement paresseux dans nos types réguliers, mais c'était une optimisation spécifique. Généralement utilisé pour les résultats de recherche - par ex. Les objets patients sont volumineux, mais les résumés patients contiennent les informations de base permettant d'identifier le patient dans un ensemble de résultats de recherche (potentiellement des centaines de Britneys et Michaels): dernier, premier, numéro de graphique, date de naissance. Nous n'avons pas permis aux objets digest de se développer sans répondre spécifiquement au besoin absolu d'étendre les propriétés.

0

Vous pouvez renvoyer un type anonyme comme System.Object, sinon vous devez "créer des types explicites pour représenter un sous-ensemble d'une entité existante". Ce que je ferais est de créer une interface publique avec un sous-ensemble des propriétés du type d'entité, puis de faire le type d'entité et le type de sous-ensemble à la fois l'implémenter. Le type de sous-ensemble peut être interne de sorte que votre code d'application ne voit que le type d'entité et l'interface.

Questions connexes