Depuis les premières bribes et previews d'Entity Framework (EF), j'ai su que Microsoft ne nous avait pas pondu la pépite tant attendue en matière d'ORM. Je me suis toujours évertué à expliquer qu'EF, malgré ce que l'éditeur avançait, n'était, non seulement rien d'autre qu'un "banal" outil de mapping Objet/Relationnel mais qu'il intégrait un nombre incroyable d'anti-patterns. Il aura fallu cette malheureuse comparaison de Dans Simmons avec NHibernate pour que la communauté des experts ORM prennent la parole et remettent les choses à leur place. Que ce soit Frans Bouma dans ce billet, ou Jeremy Miller dans celui-ci, les deux ont perçu les lacunes d'EF.
On ne refera pas ici l'histoire du mapping O/R et Microsoft avec le (feu) projet ObjectSpaces, tant de fois ressuscité. Mais l'éditeur, peu averti dans ce domaine, est tombé dans les pièges classiques de l'implémenteur débutant d'un outil de mapping. Tout d'abord, un bon ORM doit être non intrusif.
Suite:
EF est une calamité en terme d'intrusivité. Les sous-classes persistantes techniques (celles qui contiennent toute la tuyauterie du Dirty State Checking) sont des classes partielles générées dans une phase de pré-compilation, un peu à la manière de l'extendeur JDO (tant décrié). Ensuite, les références inter-objets du modèle du domaine doivent être des classes techniques héritant d'EntityRef pour pouvoir prétendre à être gérés, rendant le modèle du domaine complètement dépendant du Framework de persistance.
Si j'osais je dirais qu'EF est une sorte de mix entre des EJB 2.0 et du JDO.
Ajoutez à cela le discours techno-marketing (si si) qui tourne autour d'EDM et vous comprendrez qu'en l'état actuel je ne peux souscrire à EF. Frans l'explique d'ailleurs très bien dans son billet. On ne peut pas décemment avancer le fait que "EDM est un modèle de données universel" lorsqu'on sait à quel point il est déjà difficile pour un ORM de respecter les contraintes minimales d'une base de données relationnelle. Un modèle conceptuel de données qui permet d'abstraire du XML, du relationnel, de l'objet et des DataServices (pour Astoria) a un nom, cela s'appelle de la magie noire. Pour être franc, tout ce qu'on est capable de faire en la matière est une sorte de plus grand dénominateur commun à toutes les formes de stockage, c'est à dire pas grand chose.
NHibernate utilise du dymanic Proxy pour résoudre le problème de l'intrusivité. C'est un Framework riche (il gère plus de stratégies d'héritage que EF), performant (voir les optimisations du mode LightWeight Code Generation ou LCG), multi-bases, et n'impose aucun héritage technique. Son seul manque aujourd'hui est de ne pas supporter Linq.
Je reste tout de même optimiste, Microsoft nous a déjà démontré par le passé sa faculté à écouter la communauté. Tout développeur .NET rêve de pouvoir mettre en place une architecture n-tiers à base de WPF/Silverlight en frontend et WCF/EF/Linq en backend...
ps : Et bien voilà, on attendra donc Entity Framework V2 ![]()