web-dev-qa-db-fra.com

MySQL et MVC Entity Framework dans VS 2017 ne fonctionnent pas

J'essaie de démarrer un projet MVC EF Visual Studio 2017. Ma connexion de données est configurée avec MySQL sur mon instance locale, mais lorsque je crée un modèle de données ADO.net, le message d'erreur suivant s'affiche:

 enter image description here

Il y avait un autre article ici: Impossible d'utiliser une connexion MySQL pour l'entité framework 6 couvrant les VS 2012 et 2013, mais pas 2017. Voici la documentation MySQL qui indique quelles versions fonctionnent avec 2017: https: // dev.mysql.com/doc/visual-studio/en/visual-studio-install.html

J'utilise:

MySQL Connector Net 6.9.9 | MySQL pour Visual Studio 1.2.7 | MySQL Server 5.7

MySQL.Data 6.9.9 | MySQL.Data.Entity 6.9.9 | Entity Framework 6.1.3

Tous sont listés comme testés et fonctionnant par MySQL. Je viens d'installer tout le nouveau tout aujourd'hui, donc il n'y a pas d'anciennes versions exceptionnelles. J'ai vérifié trois fois;)

Chaîne de connexion:

<connectionStrings> <add name="MySQL" connectionString="server=localhost;port=3306;user id=root;password=password;database=localdb" providerName="MySql.Data.MySqlClient" /> </connectionStrings>


Modifier

J'ai trouvé cet article https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html qui parle de la configuration de la connexion mais, au lieu de cette erreur, le dialogue La boîte disparaît dès que je clique sur «Suivant».


Est-ce juste moi qui fais quelque chose de mal ou un connecteur MySQL cassé?

Merci d'avance pour tout conseil!

4
Alex

Ce que je devais faire était de réinstaller MySQL pour Visual Studio 2.0.5 , puis de supprimer et d'installer complètement MySQL Connector 6.9.9 . Il semble que l'ordre compte. Après cela, j'ai complètement supprimé ces paquets et les ai réinstallés dans cet ordre:

(redémarrer Visual Studio après)} _

EntityFramework 6.1.3 (I tried earlier versions and they don't work, so beware)
Mysql.Data 6.9.9
Mysql.Data.Entity 6.9.9 (NOT Mysql.Data.Entities!!! [for 6.9.9])
Mysql.Web 6.9.9

Ensuite, assurez-vous que les éléments suivants figurent dans votre fichier web.config:

(redémarrer après l'édition pour en être sûr)} _

<entityFramework>
    <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
    </providers>
  </entityFramework>

(vous devrez peut-être commenter une section existante et la remplacer par celle-ci)

La dernière étape, je devais me rappeler en revisitant ici . Cette partie est ce que j'ai oublié (été trop long), qui a causé l'erreur dans la capture d'écran dans la question.

Une dernière chose, vous pouvez avoir des versions incorrectes copiées vers où Visual Studio est installé; par exemple:

C:\Program Files (x86)\Microsoft Visual Studio\ {Année} \ {Communauté | Entreprise | Professionnel} \Common7\IDE\PrivateAssemblies

ou

C:\Program Files (x86)\Microsoft Visual Studio {Votre numéro de version} \Common7\IDE\PrivateAssemblies

MySql.Data.dll

MySql.Data.Entity.EF6.dll

MySql.Web.dll

(il faudra peut-être d'abord fermer Visual Studio)}

Vous pouvez sélectionner chaque fichier et aller à l'onglet Details sous les propriétés du fichier pour voir quelles versions vous avez.

Obtenez les nouveaux fichiers à partir d'ici (ou de l'endroit où vous l'avez installé): C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.9\Assemblies\v4.5 (cela suppose que Connector v6.9.9 utilise Framework v4.5 [consultez les propriétés de votre projet 'Application->Target Framework pour confirmer vos paramètres]).

Remarque 1: lorsque vous installez MySQL pour Visual Studio, les fichiers du dossier PrivateAssemblies sont mis à jour (voir les chemins d'accès de Visual Studio ci-dessus). VEUILLEZ donc vérifier les assemblys ci-dessus pour vous assurer qu'ils n'ont pas été modifiés. version (6.9.9 dans ce cas). Indépendamment de ce que NuGet installe, Visual Studio ne s'en soucie même pas et va regarder dans les assemblys privés (je pense que pendant le démarrage en fait).

Remarque 2: Si vous obtenez une erreur "IsPrimaryKey", voir ici .

Mon App.Config terminé qui fonctionne pour référence (à comparer avec le vôtre):

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
    </providers>
  </entityFramework>
  <connectionStrings>
    <!-- Connections Strings Go Here -->
  </connectionStrings>
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <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.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.9.9.0" newVersion="6.9.9.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
2
James Wilkins

Donc finalement, j'ai créé un nouveau projet et fait une nouvelle installation de MySQL.Data 6.9.9 | MySQL.Data.Entity 6.9.9 | Entity Framework 6.1.3 et ensuite essayé de créer à nouveau le modèle de données.

Cela a presque fonctionné! J'ai reçu une erreur en disant: 'System.Data.StrongTypingException: The value for column 'IsPrimaryKey' in table 'TableDetails' is DBNull. ---> System.InvalidCastException: Specified cast is not valid. Mais beaucoup de gens ont déjà résolu ce problème en accédant à la ligne de commande MySQL et en exécutant: set global optimizer_switch='derived_merge=off' Vous trouverez ce bogue ici: https://bugs.mysql.com/bug.php? id = 79163

Pour une raison quelconque, cela fonctionne. Voici le résultat de ma ligne de commande pour aider les débutants sur MySQL:

 enter image description here

Cela corrige TOUT! J'espère que quelqu'un trouvera que cela ne perd pas autant de temps que moi.

2
Alex

@James Wilkins Merci pour la réponse détaillée, je dois ajouter que, lorsque vous ajoutez Mysql.data ou MySQL.data.entity, la version de Assembly ne correspond pas aux assemblages installés par MySqlConnector/Net, car nous téléchargeons souvent les derniers version de Nuget, cela cause encore ce problème, donc ce que j’ai fait et résolu le problème, j’ai copié la dll (Mysql.data, MySQL.data.entity et le Web) de

C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.9\Assemblies\v4.5

dans mon dossier d’applications bin/debug et référencez-les au lieu de les télécharger à partir de Nugets. Cela a résolu mes problèmes. Vous devrez peut-être également mettre à jour la version de Assembly dans app.config ou web.config et le fichier packages.config.

<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"> 

À

<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">

Et mettez à jour la version pour les entrées ici dans packages.config

  <package id="MySql.Data" version="6.9.9" targetFramework="net452" />
  <package id="MySql.Data.Entity" version="6.9.9" targetFramework="net452" />
  <package id="MySql.Web" version="6.9.9" targetFramework="net452" />
0
Saeed Iqbal

Réglage pour confirmer que tout fonctionne, y compris la chaîne db-first gui-tool-chain de Entity Framework dans VS2017 - sur une solution .net 4.7.1 asp.net-mvc5 en utilisant ces composants exacts sur Visual Studio 2017 (VS2017 => ver15.5.7 aussi appelé VS2017 entièrement mis à jour au moment de la rédaction de cet article):

Entity Framework ver6.2.0 [nuget]
MySql.Data ver6.9.11 [nuget]
MySql.Data.Entity ver6.9.11 [nuget]
MySql.Web ver6.9.11 [nuget]
MySQL for Visual Studio ver2.0.5 [system-wide msi installer]
MySql-Connector ver6.9.11 [system-wide msi installer]

J'ai essayé d'utiliser le dernier connecteur MySql-Connector (ver.6.10.x), mais il s'est avéré que les outils d'interface graphique de VS2017 pour l'approche db-first ne fonctionneraient pas du tout. Je suppose que MySql-Connector doit être aligné avec le reste des DLL en ce qui concerne les versions.

Web.config ressemble à ceci:

<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    [...]
  </configSections>

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="Data Source=.; Integrated Security=True; MultipleActiveResultSets=True;" />
      </parameters>
    </defaultConnectionFactory>
    [...]
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
      [...]
    </providers>
    [...]
  </entityFramework>
  [...]
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add description=".Net Framework Data Provider for MySQL" invariant="MySql.Data.MySqlClient" name="MySQL Data Provider" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" />
    </DbProviderFactories>
  </system.data>
  [...]
</configuration>

Et le fichier App.config du projet enfant hébergeant le fichier .edmx ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework" requirePermission="false" />
    [...]
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
      [...]
    </providers>
  </entityFramework>
  [...]
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add description=".Net Framework Data Provider for MySQL" invariant="MySql.Data.MySqlClient" name="MySQL Data Provider" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" />
    </DbProviderFactories>
  </system.data>
  [...]
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1" />
  </startup>
</configuration>

Et le packages.config:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="6.2.0" targetFramework="net471" allowedVersions="[6.2.0]" />
  <package id="LinqKit" version="1.1.13" targetFramework="net471" allowedVersions="[1.1.13]" />
  <package id="MySql.Data" version="6.9.11" targetFramework="net471" allowedVersions="[6.9.11]" />
  <package id="MySql.Data.Entity" version="6.9.11" targetFramework="net471" allowedVersions="[6.9.11]" />
  <package id="MySql.Web" version="6.9.11" targetFramework="net471" allowedVersions="[6.9.11]" />
</packages>

Remarque: Le fichier packages.config a été modifié intentionnellement à l'aide de [allowedVersions] pour interdire les mises à niveau automatiques non intentionnelles des packages MySql vers leurs versions les plus récentes. Cela a été fait en raison de problèmes d'esquive qui affectent les versions 6.10.x des pépites MySql.

0
XDS