jeudi 3 janvier 2008

Linq et MySql

Peut-on utiliser MySql avec Linq aujourd'hui?

Le framework Linq (sur msdn ou wikipedia), fait parti de la release de .Net Framework 3.5 (novembre 2007), mais pouvait déjà être utilisé en tant que librairie dans ses versions beta.

Différents providers natifs pour Linq sont disponibles aujourd'hui dans des versions assez finalisées, mais les deux qui nous interessent pour nos bases MySql sont LinqToSql et Entity Framework.

Entity Framework
Entity Framework est destiné à être ouvert aux autres moteurs de base de données comme l'annonce Microsoft dans son communiqué de presse ou sur le blog d'ADONet:


Providers Targeting Publicly Available Versions Within Three Months of RTM

MySql devrait donc avoir ses propres providers, mais fournis par des tiers:

  • Core Lab fourni déjà une implémentation que l'on peut tester dans une version trial, mais personnellement je n'ai pas réussi à créer d'Entity Data Model avec.

  • MySQL AB, mais pas de date ni de version beta pour l'instant.

La version beta 3 de l'Entity Framework est déjà bien finalisée mais elle n'est pas au niveau de LinqToSql qui elle est déjà en version RTM. Il manque entre autre un support drag & drop pour la modélisation graphique, des buggs fix (modification d'un modèle, plusieurs schémas en base de données,...).

La version RTM doit arriver avec Visual Studio 2008.

Difficile donc de tester MySql sur ce framework aujourd'hui.


LinqToSql
Ce provider a pour cible les bases Sql Server uniquement. Entity Framework est donc la cible pour une utilisation avec des bases MySql.

Pour attendre des versions RTM des providers, on peut alors se tourner vers des solutions alternatives telles que le projet DB_Linq qui aujourd'hui gère MySql, Oracle et PostGreSql en s'appuyant sur LinqToSql.
Ce projet Open Source, qui a débuté en 2007, est jeune mais interessant pour ceux qui veulent faire des premiers tests avec MySql.
Il n'y a donc pas de support graphique pour les modèles, à l'instar de LinqToSql. Le DataContext (MContext ici) doit donc être généré via une adaptation de SQLMetal pour MySql, comme aux premières heures de Linq. SQLMetal est un projet en code DOM, permettant de générer du code source en s'appuyant sur des schémas de base de données.

Pour le tester, j'ai fait une adaptation de mon projet CodeFx.MySqlProviders. Bien que l'équipe du projet soit très réactive, la ToDo list du projet est encore longue (je cite quelques points que j'ai rencontré dans mes tests, mais ce n'est pas exhaustif):

  • Les longblob ne sont pas encore implémentés. Du coup, Les providers Profile,
    Personnalization ne peuvent pas encore être implémentés.

  • Le MContext n'implémente pas IDisposable, ce qui enlève le pattern using. Il suffit cependant de l'implémenter dans une classe partielle.

  • SqlMethods.Like plante. Pour utiliser des clauses Like on pourrait utiliser la méthode ExecuteQuery mais elle n'est pas encore implémentée ...
    Elle n'est de toute façon pas une solution, le but d'un ORM n'est pas d'avoir du code Sql qui traine dans la couche métier. De plus, ExecuteQuery ne supportent pas les types anonymes (cf. le billet de Rick Strahl), ce qui peut poser des problèmes sauf à utiliser des vues.

  • D'autres limitations sont plus imputables à Linq (La pagination par exemple car aujourdhui ne sont supportés que des Take(x) (Limit 0,x), First, Last, ...
    ) ou MySql selon les versions (requêtes imbriquées pas avant MySQL 4.1, vues pas avant MySQL 5).

De toute façon, il faut se poser la question de la pérénité d'une telle approche.

Pour aller un peu plus loin sur les providers tiers linq.

ps: pour tracer le code sql produit par le framework linqtosql, lire le billet de Kris Vandermotten

En conclusion, il est encore un peu tôt pour faire des tests MySql avec linq même si l'on nous promet une visibilité pour le premier semestre 2008.

1 commentaire:

Pascal Craponne a dit…

En presque un an depuis cet article, le projet a beaucoup mûri:
- nouveau moteur
- nouveau modèle extensible
- rapprochement de l'API linq to SQL
- rapprochement de l'équipe Mono (DbLinq devenant ainsi le moteur Linq to SQL pour Mono).
Le point d'entrée DbLinq est sur Google Code à http://code.google.com/p/dblinq2007/


Laurent Morisseau, auteur de ce blog, pour me contacter