Dans la première partie de cet article nous avons vu qu’Entity Framework 4 génère des Proxys qui héritent de nos classes POCO afin de leur ajouter des facultés de “Change Tracking” et de “Lazy loading” et nous renvoyait ces proxys. Nous avons vu que ces proxys posaient un problème lorsque nous avons voulu les sérialiser pour les exposer via un service WCF et nous avons contourné ce problème en mappant ce proxy en notre type original pendant la phase de sérialisation, de cette manière nous travaillons avec des POCO en bénéficiant de tous les apports d’Entity Framework comme le “Tracking” ou encore le “Lazy Loading” qui ne sont sincèrement pas un luxe.
Cette idée est néanmoins un “Work around” et j’ai tout de suite vu ces limites lorsque j’ai essayé de renvoyer un objet avec des entités liées => retour à la case départ problème de dé sérialisation … Il existe un autre moyen de travailler avec Entity Framework et des POCO que nous allons illustrer dans cet article.
En effet, nous pouvons choisir de dire au context que je ne veux pas qu’il génère des proxys de cette manière
context.ContextOptions.ProxyCreationEnabled = false;
Mais dans ce cas il faut assumer ces responsabilités :) Entity Framework ne fait plus de Tracking de changement sur les entités ni de Lazy Loading, les entités doivent donc accomplir ces fonctionnalités toutes seules, et c’est qui qui s’y colle? Bien évidemment ce n’est pas nous :). Je ne sais pas si vous vous en souvenez mais nous avons parlé dans cet article d’un Template T4 fournit par l’équipe ADO.NET qui génère les entités POCO à partir du modèle edmx, ce template nous génère avec nos POCO la partie qui s’occupe du Tracking de changements et les entités deviennent alors des STE : Self Tracking Entities, c’est à dire qu’elles embarquent la logique de Tracking. Et qu’en est il du lazy loading? Là par contre, si le lazy loading est un point crucial pour vous alors cette solution n’est pas faite pour vous, ou bien vous allez vous embarquer dans un développement custom.
Comment tester que le “Self Tracking” marche?
Pour tester il suffit de charger une entité de la base de données, modifier une de ses propriétés et appeler le SaveChanges du context en cours, si la modification est sauvegardée en base de données c’est que le Tracking de changement a bien fonctionné.
Récapitulons
Nous avons trois manières de travailler avec Entity Framework dans une applications n-tiers:
1 – Utiliser les entités Entity Framework (non POCO) dans toutes les couches de notre application :
- C’est mal !!! pour diverses raisons que nous avons parcouru dans un précédent article
- Pas de problème de sérialisation des entités via un service WCF
- Nous Bénéficions du tracking de changements et du Lazy Loading
2 - Utiliser des entités POCOs avec génération de proxy et le Template T4 C# POCO Entity Generator :
- Problème de sérialisation des entités via un service WCF
- Nous Bénéficions du tracking de changements et du Lazy Loading
3 - Utiliser des entités POCOs sans génération de proxy et le Template T4 C# POCO Entity Generator :
- Pas de problème de sérialisation des entités via un service WCF
- Nous Bénéficions du Self Tracking
- Pas de Lazy loading
Faites votre choix selon vos besoins et vos exigences :)