29 votes

Utilisation de MySql avec Entity Framework 4 et le CTP Code-First Development

J'ai pensé que je pourrais expérimenter un peu avec le programme de Scott Guthrie. dernier poste sur le code-first dev avec Entity Framework 4. Au lieu d'utiliser Sql Server, j'essaie d'utiliser MySql. Voici les parties pertinentes de mon web.config (il s'agit d'une application Asp.Net MVC 2) :

<connectionStrings>
    <add name="NerdDinners"
         connectionString="Server=localhost; Database=NerdDinners; Uid=root; Pwd=;"
         providerName="MySql.Data.MySqlClient"/>
  </connectionStrings>
  <system.data>
    <DbProviderFactories>
      <add name="MySQL Data Provider" 
           invariant="MySql.Data.MySqlClient" 
           description=".Net Framework Data Provider for MySQL" 
           type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.2.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>

Comme dans le tutoriel, je m'attends à ce que EF4 génère automatiquement la base de données pour moi. Au lieu de cela, il lève une ProviderIncompatibleException, avec une exception interne se plaignant que la base de données NerdDinners n'existe pas.

Je suis allé créer la base de données MySql juste pour voir si les choses allaient fonctionner, et j'ai eu une autre ProviderIncompatibleException à la place. Cette fois, "DatabaseExists n'est pas pris en charge par le fournisseur".

Je dois admettre que c'est la première fois que je me plonge vraiment dans Entity Framework (je me suis surtout contenté de Linq to Sql), et tout cela fonctionne sur le Code-First CTP publié la semaine dernière. Cela dit, y a-t-il quelque chose que je fais mal ici, ou un problème connu qui peut être contourné ?

26voto

Darkside Points 999

Bien, j'ai finalement réussi à le faire fonctionner avec quelques points d'intérêt.

  • Impossible de créer une BD, elle doit déjà exister
  • Vous devez créer une chaîne de connexion pour chaque concours DB en utilisant le nom du DBContext (dans l'exemple ci-dessus, une chaîne de connexion doit exister avec le nom "NerdDinners"), et pas seulement une chaîne par défaut (sinon il utilisera SQL)
  • Il utilisera le nom du DBSet que vous utilisez pour définir votre contexte comme nom de la table, donc faites attention lorsque vous les nommez.

Dans l'ensemble, une longue route, mais nous y sommes arrivés à la fin.

**Mise à jour Autre point à noter, lors du déploiement de votre site MVC utilisant MySQL, vous devrez probablement ajouter une DataFactory à votre web.config. En général, cela est dû à la différence entre les connecteurs MySQL existants et les versions de MySQL qui sont supportées. (réponse trouvée par d'autres sources après s'être beaucoup creusé la tête) Il suffit d'ajouter :

  <system.data> 
    <DbProviderFactories> 
      <add name="MySQL Data Provider"
           invariant="MySql.Data.MySqlClient"
           description=".Net Framework Data Provider for MySQL"
           type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> 
    </DbProviderFactories> 
  </system.data>

Dans une section distincte de votre web.config. en veillant à définir le numéro de version de la DLL MySQL.Data.dll que vous déployez avec le site (c'est aussi une bonne idée de "copier en local" vos DLL MySQL pour assurer la compatibilité.

2voto

GinjaNinja Points 28

Un autre point d'intérêt - Si vous ajoutez l'entrée "MySQL Data Provider" à votre machine.config locale ( C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config dans mon cas) vous pouvez alors vous connecter à votre instance MySql via Visual Studio...

2voto

AlexC Points 3557

Cette question et cette réponse m'ont été très utiles pour la migration d'un projet EF plus important de SQL à mySQL. J'ai donc pensé ajouter mes notes et j'espère qu'elles seront utiles :

Comme indiqué, le nom de la chaîne de connexion doit correspondre au nom de la classe qui étend le System.Data.Entity.DbContext.

Il semble qu'il n'y ait toujours pas de moyen de créer des tables dans EF en utilisant le connecteur mySQL mais vous pouvez utiliser et modifier le SQL create scripts pour générer les tables mySQL. Le moyen le plus simple que j'ai trouvé pour le faire était de commenter la fonction OnModelCreating sur le DbContext étendu selon que le code était nécessaire pour recréer des tables. Si je constate que je fais cela plus souvent, je prévois de résoudre ce problème en utilisant l'injection de dépendance et d'avoir des classes séparées basées sur une configuration mySQL ou MSSQL.

J'ai trouvé plus facile de m'assurer que les boîtes de développement et les serveurs avaient le bon connecteur mySQL .dll packagé dans la version plutôt que de m'embêter avec les DbFactoryProviders dans le webconfig. Le fait d'avoir un packaging correct dans le package de construction du projet/solution signifiait que je n'avais besoin que des lignes de la chaîne de connexion et non des lignes DbFactoryProviders, ce que j'ai trouvé difficile à faire de manière cohérente sur un certain nombre de machines.

J'ai dû modifier la sensibilité à la casse de l'identifiant mySQL, qui est passée de 0 à 1. Sans ce paramètre, le SQL qui se connectait à EF ne pouvait pas trouver les tables qui étaient présentes à cause des noms de mes objets qui étaient en majuscules et en minuscules par rapport aux tables en majuscules et en minuscules que mySQL crée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X