2009-10-19 8 views
0

Supposons que j'ai un projet MyData, puis j'ajoute MyDb.edmx avec l'assistant EF. Dans Ma base de données, j'ai une table Person. Ensuite, je vais obtenir une entité Personne dans le modèle EF.Comment utiliser le contexte d'entité dans la classe d'entité pour les performances?

Je veux étendre cette personne par classe partielle dans un person.cs de fichiers séparés comme:

namespace MyData 
{ 
    public partial class Person 
    { 
     [DataMember] 
     public int MyTotal 
     { 
      get 
      { 
       int count = 0; 
       using (MyEntities ctx = new MyEntities()) 
       { 
        //run some linq to get calc based on other entities 
       } 
       return count; 
      } 
     } 
} 

Il fonctionne très bien. Ensuite, au client, je peux obtenir l'instance Person de l'entité avec la propriété MyTotal. Problème: lorsque je veux lister une personne du côté client (par exemple, silverlight), la performance est très mauvaise car pour chaque instance de Person, cela provoquera une connexion SQL DB et exécutera un SQL pour MyTotal.

Si j'ai plus d'un tel type de propriété d'extension, les performances seront très mauvaises. Comment résoudre ce problème?

Répondre

1

Tout d'abord, je recommande fortement de ne pas mettre cela dans une propriété. Les propriétés doivent avoir peu ou pas de code - dans un cas comme celui-ci, où vous allez effectuer une logique significative, il serait plus logique d'utiliser une méthode (par exemple: GetMyTotal()), car cela rendra plus évident l'utilisateur que vous allez exécuter un processus potentiellement long en cours à ce stade.

Cela étant dit, vous avez quelques options ici. Ma préférence personnelle serait de pré-lire cette information. Vous pouvez changer votre Entité pour tirer results from a Stored Procedure instead of a table. Cela vous permettrait de pré-calculer toutes ces valeurs, sur le serveur, et de ne tirer qu'un seul résultat sur le réseau. Cela a également l'avantage de vous permettre de "mettre en mémoire cache" cette valeur sur le client, ce qui signifie que vous pouvez en conserver une propriété (puisque la valeur totale sera déjà dans l'entité).

+0

Lors de l'utilisation de toutes les entités générées automatiquement par EF, il conservera toutes les relations (association). Si vous utilisez l'entité personnalisée récupérée par les procédures stockées, je ne suis pas sûr si toutes ces relations seront conservées. Sinon, vous devez construire toutes ces associations manuellement, ce qui sera douloureux. – KentZhou

+0

Oui, mais vous essayez d'ajouter quelque chose à une entité qui ne va pas fonctionner avec une entité autogénérée (bien). C'est l'un des scénarios exacts pour lesquels ils ont ajouté la possibilité d'utiliser des procédures stockées pour générer des entités. –

+0

Merci. Si j'ai un couple de résultats de calcul et que je veux les lier à une entité telle que People, sinon changer Entity (garder tout généré automatiquement aucun changement), quelle est la meilleure solution? – KentZhou

Questions connexes