2010-07-19 3 views
29

Je pensais expérimenter un peu avec latest post de Scott Guthrie sur le développement de code-premier avec Entity Framework 4. Au lieu d'utiliser Sql Server, j'essaie d'utiliser MySql. Voici les parties pertinentes de mon web.config (ce qui est une application Asp.Net MVC 2):Utilisation de MySQL avec Entity Framework 4 et le CTP de développement de code

<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> 

Tout comme le tutoriel, je me attends EF4 pour générer le db pour moi automatiquement. Au lieu de cela, il lance une exception ProviderIncompatibleException, avec une exception interne se plaignant que la base de données NerdDinners n'existe pas.

Assez juste; Je suis allé et ai créé la base de données MySQL pour cela juste pour voir si les choses fonctionneraient, et ai obtenu une autre ProviderIncompatibleException à la place. Cette fois, "DatabaseExists n'est pas supporté par le fournisseur". J'admettrai que c'est la première fois que je me lance dans Entity Framework (je me suis surtout concentré sur Linq to Sql), et que tout fonctionne sur le CTP de Code-First sorti la semaine dernière. Cela dit, y a-t-il quelque chose que je fais de mal ici, ou un problème connu qui peut être réglé?

+0

Vous avez raison, un fournisseur mysql existe (http://stackoverflow.com/questions/76488/using-mysql-with-entity-framework/848539#848539). Il est possible que les bits CTP aient des bogues ou que le functinoality (ou les deux) manque au fournisseur MySQL. – marcind

+0

êtes-vous capable d'utiliser une adhésion simple dans MVC 4 avec MySQL? –

Répondre

25

A droite, j'ai enfin travaillé avec quelques points d'intérêt.

  • Impossible de créer un DB, doit déjà exister
  • Vous devez créer une chaîne de connexion pour chaque concours DB en utilisant le nom DBContext (dans l'exemple ci-dessus connectionstring doit exister avec le nom « NerdDinners »), non juste un par défaut (sinon il utilisera SQL)
  • Il utilisera le nom du nom DBSet que vous utilisez pour définir votre contexte comme nom de la table, alors soyez prudent lorsque vous les nommez.

Dans l'ensemble, un long chemin mais à la fin

** Mise à jour Un autre point à noter, lors du déploiement de votre site en utilisant MVC MySQL, vous aurez besoin plus comme ajouter aussi un DataFactory à votre site .config. Habituellement en raison de la différence entre les connecteurs MySQL et les versions de MySQL supportées. (réponse trouvée par d'autres sources après beaucoup gratter 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> 

En tant que section séparée à votre web.config en vous assurant de définir le numéro de version du MySQL.Data.dll déployer avec le site (aussi une bonne idée de "copier en local" vos DLL MySQL pour assurer la compatibilité)

+0

Marqué vôtre comme la réponse, puisque vous avez trouvé un moyen :). Super travail! – Dusda

+0

Avez-vous dû créer les tables vous-même ou est-ce que cela génère les tables pour vous? – DennyFerra

+0

Entity framework ne peut toujours pas créer des tables malheureusement, donc vous devrez le faire vous-même (notez également sur certains hôtes les noms de tables et les noms de colonnes sont sensibles à la casse). – Darkside

2

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 ensuite vous connecter à votre instance MySql via Visual Studio ...

2

Cette question et la réponse a été très utile pour moi la migration d'un projet plus vaste EF de SQL à mySQL, donc je pensais que je voudrais ajouter mes notes et nous espérons qu'ils sont utiles:

Comme il est indiqué le nom de la chaîne de connexion a pour correspondre au nom de la classe qui étend le System.Data.Entity.DbContext.

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

J'ai trouvé plus facile de m'assurer que les devbox et les serveurs avaient le connecteur mySQL correct .dll emballé dans la version que mess avec le DbFactoryProviders dans le webconfig. Obtenir l'empaquetage correct dans le paquet de construction de projet/solution signifiait que j'avais seulement besoin des lignes de chaîne de connexion et pas des lignes DbFactoryProviders que je trouvais difficiles à travailler de manière cohérente sur un certain nombre de machines. J'avais besoin de changer la sensibilité à la casse de l'identifiant mySQL du paramètre que j'avais de 0 à 1. Sans ce paramètre, le SQL que EF connecté ne pouvait pas trouver les tables qui étaient là en raison des noms de cas mixtes de mes objets par rapport à les tables de cas fixes créées par mySQL.

Questions connexes