4 votes

EF4 Code First : Problème de chargement paresseux

Sur le site web sur lequel je travaille actuellement, j'ai décidé de donner une chance à EF4 Code First. Cela ne semble pas si mal, bien que le fait de ne pas supporter les enums signifie que les points impressionnants sont annulés par un simple inconvénient.

Quoi qu'il en soit, le problème que je rencontre aujourd'hui est que j'ai un objet livre qui contient une collection d'auteurs. Lorsque je clique sur une page où le livre est commenté, une erreur est générée car les auteurs du livre ne peuvent pas être ajoutés aux données de la vue - la collection d'auteurs pour ce livre est nulle.

Je me rends donc sur la page d'administration, j'édite le livre et, soudain, les auteurs réapparaissent. Je retourne donc à la page de révision et les auteurs apparaissent maintenant sur cette page également.

Il semble qu'ils ne soient pas chargés la première fois, mais pour une raison quelconque, la section d'administration les charge, de sorte que lorsque je retourne à la page d'évaluation, tout fonctionne bien.

Si par hasard je fais une recompilation, et que je vais directement à la page de révision, ils ont à nouveau disparu.

J'obtiens mes livres à partir du contexte en utilisant l'ensemble CreateObject - via le référentiel. Cette méthode est utilisée à la fois sur la page d'administration et sur la page de révision.

Merci si vous pouvez nous aider.

8voto

Ladislav Mrnka Points 218632

Pour permettre le chargement paresseux de la classe POCO, vous devez marquer vos propriétés de navigation comme virtuelles. Pour forcer le chargement paresseux, modifiez la requête dans votre référentiel et utilisez quelque chose comme Include("Authors") sur l'ObjectSet interrogé.

1voto

nick Points 664

Je viens de faire un peu plus de recherches et je sais pourquoi cela fonctionne sur la page d'administration. Après avoir débogué, j'ai découvert que la collection d'auteurs du livre est initialement nulle. Mais lorsqu'une liste de sélection est affichée, qui contient tous les auteurs du système, sa collection d'auteurs est remplie.

Ainsi, dans mon action de révision, je récupère tous les auteurs du référentiel, sans les utiliser d'aucune manière, et la collection de mon livre est également alimentée.

Je suppose que toutes ces tergiversations nous amènent à nous poser la question suivante : Comment puis-je corriger le lazy loading, ou comment puis-je assurer le eager loading. Je ne pense pas que la performance sera jamais critique et j'ai eu assez à faire avec le code d'abord maintenant. Je pense que je vais m'en tenir à Active record/nhibernate pour le moment sur d'autres projets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X