Entity Framework avec Code First et MySql 5.6.14 (dernière version en cours)

Une question posée sur un forum de StackOverflow m’a fait me demander comment faire fonctionner Entity Framework avec Code First et MySql,  Code First plus particulièrement  puisque c’est à priori le moins évident coté .Net, le code devant générer la base de données correctement.

Sans entrer dans les détails de ce qu’est Entity Framework (Si vous lisez ceci, j’imagine que vous l’utilisez déjà), disons simplement que vous pouvez l’utiliser selon 2 scénarios de base:

  • Partir d’une base de données existante et générer les classes de définition des données (Modèles)
  • Ecrire le code de définition des données, et générer les tables à partir de ce code. cette dernière approche, commençant par l’écriture du code, s’appelle (logiquement!) Code First.

Pour tester le fonctionnement d’Entity Framework avec MySql, j’ai créé une petite application console, de manière à éliminer tout ce qui n’est pas absolument nécessaire. Vous pourrez télécharger le projet en fin d’article, mais je vais d’abord décrire quels sont les éléments nécessaires et les principales étapes.

  • Visual Studio 2012, n’importe quelle version. Pas testé avec d’autres versions.
  • MySql. Le mieux est de charger et d’installer MySql Installer, qui comporte le server lui-même, mais aussi WorkBench, outil de gestion du serveur très bien fait, et les connecteurs.
  • Le reste sera installé directement dans l’application avec NuGet.

Création de l’application

Comme dit plus haut, il s’agit d’une simple application console, sans rien d’autre.

MySQLAppCreate

Pour pouvoir utiliser Entity Framework, la première chose à faire est de l’installer. Pour cela j’utilise NuGet, dans lequel je cherche EntityFramework.

mySqlAppEF

La version actuelle est la version 5.0, c’est avec elle que j’ai créé cette application de test.

Maintenant, ça se complique un peu. En effet, le connecteur MySql installé avec le serveur et WorkBench correspond à la version 4.2 d’EntityFramework. Si nous voulons un connecteur correspondant à EF 5.0, et capable d’en exploiter les fonctionnalités, il nous faut installer la version 6.7.2 beta au lieu de la version actuelle proposée. Pour cela, dans la console de NuGet, tapez “Install-Package MySql.Data.Entity –Pre”. Vous devriez voir ceci:

MySqlAppConnector

L’installation de EntityFramework par NuGet, en plus de mettre les références correctement dans votre projet, a aussi eu pour effet de modifier votre app.config pour y ajouter une configuration par défaut. Si cette configuration est parfaite lorsque l’on utilise un des serveurs MS SQL, c’est juste une source de confusion pour MySql. Aussi nous allons éliminer de notre fichier de configuration tout ce qui concerne EntityFramework, et ajouter ce qui est nécessaire pour MySql:

Nous pouvons maintenant coder notre application. N’ayant d’autre but que d’être un simple test, je n’ai pas créé de répertoire “Model”, comme je le ferais normalement pour les classes modélisant les données. Je vous laisse lire le code, que je crois suffisamment simple pour ne pas nécessiter plus de commentaires ici. Juste une remarque concernant Eager Loading et Lazy Loading, et l’explication du code commenté dans Program.cs: par défaut, EntityFramework utilise LazyLoading, c’est à dire que les données ne sont chargées de la base de données et mises en mémoire que lorsque cela est nécessaire. Très bien, cela libère le programmeur, et son application, de savoir à quel moment exactement les données sont chargées depuis la base de données. Trés bien aussi, puisque ces données sont mises en mémoire à la demande, et pas par gros paquets pas forcément utiles. Seulement, pour que cela fonctionne, il faut pouvoir obtenir plusieurs requêtes sur la même connexion.   Si vous regardez ce code:

même si ce n’est pas évident, aPerson.Phones.Count génère une requête alors que nous sommes en train de lire les résultats d’une autre. Aucun problème avec MS SQL qui implémente MARS (Multiple Active Result Sets), une fonctionnalité permettant plus d’une requête active à la fois sur la même connection. MySql, à ma connaissance, n’a pas d’équivalent. Il nous faut donc utiliser Eager Loading, c’est à dire que Entity Framework va attendre que nous lui disions quelles données liées nous souhaitons. Le code commenté montre une première méthode, avec .Include, le code non commenté une seconde, avec .ToList . Pour voir ce qui se passe, supprimez .ToList et les parenthéses, et relancez l’application.

ToList a pour effet de forcer l’évaluation de la requête, Entity Framework va donc générer tous les JOIN nécessaires. Cependant, si vous avez beaucoup de tables liées cette méthode peut être plus longue à exécuter, puisque toutes les relations vont être évaluées, alors que Include vous permet de sélectionner précisemment ce que vous souhaitez inclure.

Au fait, dernier point: si la base de données dans la chaine de connexion (test, ici) n’existe pas sur votre serveur, Code First la créera pour vous!

Merci de partager vos remarques par le biais des commentaires.

This work is licensed under a Creative Commons license.

Publié dans ASP.NET MVC 4.0
2 commentaires sur “Entity Framework avec Code First et MySql 5.6.14 (dernière version en cours)
  1. Kevin dit :

    Cool le tuto, mais le fichier attaché n’est plus !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Lettre d’information

Recherche sur le Site

Recherche personnalisée