Executive summary : Entity Framework est le framework de mapping O/R de Microsoft. On passe directement de la version 1 à la version 4, mais les améliorations semblent le justifier. On est désormais au niveau de NHibernate, et peut-être plus pour certaines fonctionnalités, mais je ne suis pas un spécialiste de l’un ou de l’autre. Une des grosses nouveautés est l’approche Model First, permettant de faire le cheminement inverse de ce qui se fait traditionnellement en EF, et partir du modèle objet pour générer une base de données. Malheureusement, Microsoft semble retomber dans ses travers et avoir mis en place une fonctionnalité géniale qui ne pourra pas être utilisée par des applications industrielles, qui ont un cycle de vie, avec des versions. Le script SQL de création de base de données est bien généré, mais rien pour suivre les modifications. Bref, de mon point de vue, bien tenté, mais le problème reste entier…
La session est présentée par Matthieu Mezil et Alexandre Equoy. Le but est de réaliser une introduction à Entity Framework, et de voir les nouveautés, de type Model First, ou l’intégration dans des applications n-Tiers.
Mapping Objet-Relationnel
Le mapping O/R consiste à mettre en correspondance un modèle métier sur un modèle tabulaire de base de données. Le codeur utilise donc un modèle objet pour accéder aux données, ce qui représente un niveau d’indirection utile par rapport à du SQL en dur.
L’Entity Data Model fait le lien, en EF, entre le modèle de stockage et le modèle conceptuel métier. Une nouveauté d’EF4 est l’approche Model First : on n’est plus obligé de faire du bottom up en partant de la base et en remontant le modèle. On peut donc désormais faire l’inverse, mais on peut aussi faire du Plain Old CLR Object (POCO).
Demo
On ajoute un ADO.NET Entity Model dans Visual Studio 2010. Comme souvent, on se base sur Northwind comme base de données d’exemple. Les intervenants mettent en avant la capacité de singularisation ou de pluralisation des noms, mais j’ai du mal à croire que ça fonctionne en une autre langue que le français.
Une fois le modèle établi, avec un type par table, on ajoute une notion d’héritage, en reliant les clés. Un premier modèle simple est réalisé, et on montre des nouveautés d’EF4 : si on sélectionne des membres, on peut extraire ces champs dans une nouvelle entité, et les supprimer de la précédente. Il faut alors les relier dans la nouvelle entité sous forme de type complexe. Autre nouveauté : on peut mapper des complex types sur des procédures stockées, et même générer automatiquement des types de retour pour prendre en compte la sortie de la procédure.
Nouveautés
- Intégration des clés étrangères.
- Lazy loading : on n’a plus besoin de charger manuellement la liste des éléments associés en 1-N, et elle sera chargée seulement lors de la première utilisation.
- Approche ModelFirst : très intéressant, car on peut partir d’un modèle objet, et laisser EF4 générer la base qu’il faut pour que ça passe. Ca peut être très intéressant, mais il serait intéressant de voir comment se passe la montée en version de la base (et surtout, comment on la porte chez un client). Ajout après coup : une question est posée là-dessus à la fin de la session, et il semblerait qu’on en soit pour nos frais : il faudra faire à la main. Comme souvent chez Microsoft : c’est super d’avoir de bonnes idées comme ça, mais si on ne les pousse pas au bout, ça ne sert à rien !
- POCO : objets .NET utilisés comme entités, et on n’est plus obligés d’avoir de l’héritage d’un objet EF.
- Inclusion de la validation.
Les intervenants lancent une démonstration de l’approche Model First. On crée toujours un EDM dans Visual Studio, mais à vide, et on ajoute les entités une par une. On peut ensuite lancer la commande de génération de la base de données. Le script DDL est alors créé, et pourra être rejoué pour mettre en place d’autres bases.
L’approche POCO consiste à mettre en place une librairie de classe complètement à part. Ces objets ne doivent pas avoir à hériter ou implémenter des classes d’EF4. Cela permet de mettre en place EF4 sur des architectures déjà existantes, ou aussi de ne pas être dépendant d’EF4, et donc plus facilement portable sur une autre technologie. Je ne sais pas si c’est une nouvelle politique de Microsoft, mais les intervenants ne parlent pas des technologies concurrentes (NHibernate, etc.), voire laissent à penser qu’il n’y en a pas.
Note : plusieurs fois depuis ce matin, les présentateurs font voir la fonction de génération d’une classe non connue comme une nouveauté, mais ceci existait déjà en VS2008.
Template T4
L’idée est d’augmenter la productivité en utilisant des templates qui exploitent les métadonnées d’EF4 pour générer du code. En fait, Microsoft a ouvert les modèles qui servent d’habitude à générer le code EF. Typiquement, on ne pouvait pas auparavant customiser la génération de code EF : on était obligé de prendre ce qui avait été créé, et si on avait besoin de mieux, de l’appeler ou de l’hériter depuis une autre classe. On peut désormais modifier directement le template utilisé pour générer le code, avec ainsi une très grande souplesse pour de la validation, des ajouts de fonctionnalité, etc.
Scenarii n-Tiers
Le gros problème dans ces architectures est que même si on se trouve sur des tracking entities (entités qui tracent les modifications qui leur sont apportées pour les reporter ensuite dans la base de données), le saut d’un tiers leur fait perdre le contexte. La nouvelle approche d’EF4 est les self-tracking entites pour contrer cette limite. Microsoft fournit la template pour mettre ceci en place.
RIA Services et ADO.NET Data Services sont des solutions qui s’utilisent beaucoup plus facilement avec EF. RIA Services est très lié à Silverlight, et Data Services est limité au mode REST, donc ce sont deux technologies finalement limitées, du coup. La solution proposée par Matthieu Mezil est d’utiliser WCF pour pointer sur de l’EF. Comme le code WCF est souvent le même, l’idée est de mettre en place des templates pour les opérations CRUD sur des services WCF.
Retour sur les templates
Note : T4 n’est pas limité à EF, mais peut être utilisé pour tous les cas de génération de code.
Toutes les couches WCF (services, contrats de service, éventuellement mocks pour les services, etc.) sont très ressemblantes entre chaque entité. Il est donc intéressant de les générer…
Il y a un bouton directement dans VS2010 pour régénérer toutes les sorties des templates T4 lors d’une modification des modèles. Les templates peuvent s’appliquer également à du XAML, ou n’importe quel type de sortie.
Saga EFX sur MSDN pour plus d’information.
Conclusion
Les intervenants reconnaissent que le temps de formation est bien plus important qu’en ADO.NET, mais le ROI est selon eux au rendez-vous. Toute cette technologie est à tester, et il y a des concurrents, typiquement NHibernate, sur lequel on peut greffer ActiveRecord.