2

Je vais bientôt commencer à coder une nouvelle application Web. L'application sera construite en utilisant ASP.Net MVC 3 et Entity Framework 4.1 (approche de la base de données). Au lieu d'utiliser les classes EntityObject par défaut, je vais créer des classes POCO à l'aide du générateur d'entité POCO ADO.NET. Lorsque je crée des POCO à l'aide de cet outil, il ajoute automatiquement le mot clé virtuel à toutes les propriétés pour le suivi des modifications et les propriétés de navigation pour le chargement différé. J'ai cependant lu et vu des démonstrations, que Julie Lerman (EF Guru!) Semble désactiver le chargement paresseux et modifie également son modèle POCO afin que le mot-clé virtuel soit retiré de ses classes POCO. Julie explique pourquoi elle le fait parce qu'elle écrit des applications pour les services WCF et que l'utilisation du mot-clé Virtual entraîne un problème de sérialisation. Elle dit, comme un objet est sérialisé, le sérialiseur touche les propriétés de navigation qui déclenche alors le chargement paresseux, et avant que vous le sachiez, vous tirez toute la base de données à travers le fil.Entity Framework POCO Sérialisation

Je pense que Julie était peut-être exagérée quand elle a dit que cela pourrait tirer toute la base de données à travers le fil, cependant, cette idée me fait peur!

Ma question est (enfin), devrais-je aussi supprimer le mot-clé Virtual de mes classes POCO pour mon application MVC et utiliser DectectChanges pour mon suivi des modifications et Eager Loading pour demander des propriétés de navigation.

Nous vous remercions de votre aide.

Merci comme toujours.

Répondre

4

La sérialisation peut en effet déclencher un chargement paresseux car le getter de la propriété de navigation n'a pas le moyen de détecter si l'appelant est le sérialiseur ou le code utilisateur. Ce n'est pas le seul problème: si vous avez des propriétés de navigation virtuelle ou toutes les propriétés comme EF virtuel créera un type de proxy à l'exécution pour vos entités, les instances d'entité avec lesquelles le sérialiseur devra traiter à l'exécution seront typiquement un type différent de celui que vous avez défini. Les recommandations de Julie sont la façon la plus simple et la plus raisonnable de traiter les problèmes, mais si vous voulez toujours travailler avec les capacités des proxies la plupart du temps et si parfois les sérialiser avec WCF, il existe d'autres solutions disponibles:

  • vous pouvez utiliser un DataContractResolver pour cartographier les types de proxy à sérialiser les types originaux
  • vous pouvez également désactiver uniquement le chargement paresseux lorsque vous êtes sur le point de sérialisation un graphique

Mor Les détails sont contenus dans cet article de blog: http://blogs.msdn.com/b/adonet/archive/2010/01/05/poco-proxies-part-2-serializing-poco-proxies.aspx

En outre, ma recommandation serait que vous utilisiez le modèle DbContext et non le modèle POCO. DbContext est la nouvelle API que nous avons publiée dans le cadre d'EF 4.1 dans le but d'augmenter la productivité.Il a plusieurs avantages comme le fait qu'il effectuera automatiquement DetectChanges de sorte que vous n'aurez pas besoin en général de vous préoccuper de l'appel de la méthode vous-même. De plus, les entités POCO que nous générons pour DbContext sont plus simples que celles générées avec les modèles POCO. Vous devriez être en mesure de trouver beaucoup d'exampels MVC en utilisant DbContext.

0

Eh bien cela dépend de votre besoin, si vous allez sérialiser vos classes POCO que oui, vous devez les supprimer (Par exemple: lorsque vous utilisez les services WCF ou tout ce qui sérialisera l'ensemble de votre objet). Mais si vous construisez simplement une application web qui a besoin d'accéder à vos classes, je les laisserais dans vos classes pendant que vous contrôlez les objets que vous accéderez dans vos classes via votre code.

Questions connexes