MySQL和MVC Entity Framework在VS 2017中无法工作

6

我正在尝试启动一个MVC EF Visual Studio 2017项目。我已经在我的本地实例上使用MySQL设置好了数据连接,但是当我尝试创建ADO.net数据模型时,我遇到了图片中显示的错误:

enter image description here

这里曾经有一篇文章: 无法在实体框架6中使用MySQL连接,它涵盖了VS 2012和2013,但不包括2017。这是MySQL文档,说明哪些版本适用于2017:https://dev.mysql.com/doc/visual-studio/en/visual-studio-install.html 我正在使用:
MySQL Connector Net 6.9.9 | MySQL for 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
所有这些都被MySQL列为经过测试并可用的。我今天刚安装了所有新版本,因此没有旧版本存在。我三重检查了 ;)
连接字符串:

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


这段代码是关于连接数据库的配置信息,其中包括了服务器地址、端口号、用户名、密码以及要连接的数据库名称。这里使用的是MySQL数据库,并且使用了MySql.Data.MySqlClient提供的程序集。

编辑

我找到了这篇文章https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html,讲解设置连接,但现在换成这个错误,一旦我点击“下一步”,对话框就消失了。


这是我的错还是MySQL连接器出了问题?谢谢提前给予的任何建议!

你需要更新实体框架版本,因为它显示你的项目比实体框架更新。 - Ancient
@Ancient 我正在运行今天更新的EF 6.1.3版本。 - Alex
请将您的连接字符串添加到问题中。 - derloopkat
@derloopkat,我还能添加什么其他有帮助的内容吗? - Alex
你好, 你是如何在Visual Studio中安装MySQL的?我正在使用Visual Studio 2017 Enterprise 15.4.2,但是MySQL for Visual Studio的安装(使用MySQL安装程序或独立安装程序)都失败了。我尝试了这个解决方法==> bugs.mysql.com/bug.php?id=85908&thanks=3&notify=195,但是MySQL for VS的安装仍然在90%时回滚。请帮帮我,我已经苦苦挣扎了三天,无法从我的数据库更新模型:/当我单击新连接窗口上的“从数据库更新模型”时,没有MySQL数据库选项显示。请帮忙一下? - Pierrick Martellière
4个回答

3
我需要做的是重新安装MySQL for Visual Studio 2.0.5,然后完全删除并安装MySQL Connector 6.9.9。看起来顺序很重要。之后,我完全删除了这些程序包,并按照以下确切的顺序重新安装它们:(之后重新启动Visual Studio)
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

然后,请确保以下内容在您的web.config文件中:

(编辑后请务必重新启动)

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

最后一步是我需要通过重新访问这里来提醒自己。

那部分是我忘记了的(时间太长了),这导致了问题截图中的错误。

最后一件事,你可能已经将不正确的版本复制到Visual Studio安装的位置;例如:

C:\Program Files (x86)\Microsoft Visual Studio\ {Year}\ {Community|Enterprise|Professional}\Common7\IDE\PrivateAssemblies

或者

C:\Program Files (x86)\Microsoft Visual Studio {Your Version Number}\Common7\IDE\PrivateAssemblies

MySql.Data.dll

MySql.Data.Entity.EF6.dll

MySql.Web.dll

(可能需要先关闭Visual Studio)

您可以选择每个文件,并在文件属性下转到详细信息选项卡以查看您拥有的版本。

从这里获取新文件(或任何其他安装位置):C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.9\Assemblies\v4.5 (假设使用Connector v6.9.9和框架v4.5 [请确认您的项目属性的应用程序 ->目标框架])。

注意1:当您为Visual Studio安装MySQL时,它会更新PrivateAssemblies文件夹中的文件(请参见上面的Visual Studio路径),因此请仔细检查上述程序集,以确保它们没有更改为任何其他版本(在这种情况下为6.9.9)。无论NuGet安装了什么,Visual Studio都不会关心,并且将查找私有程序集(我认为实际上是在启动期间)。

注意2:如果出现“IsPrimaryKey”错误,请参见此处

我的已完成的App.Config以供参考(与您的进行比较):

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

1
{btsdaf} - shahsani
我正在使用Visual Studio 2017 Enterprise 15.4.2和MySQL for Visual Studio安装(使用MySQL安装程序或独立安装程序)即使是开发版本也失败了。我尝试了这个解决方法==> bugs.mysql.com/bug.php?id=85908&thanks=3&notify=195,但安装仍然在90%时回滚。请帮忙,我已经挣扎了3天,无法从我的数据库更新模型:/当我单击新连接窗口上的“从数据库更新模型”时,没有MySQL数据库选项显示。 - Pierrick Martellière
最好的方法是从头开始,卸载除了数据库以外的所有与MySQL相关的内容,然后按照正确的顺序进行操作。如果不按照正确的顺序进行操作,事情就不会起作用。至于安装程序失败的原因,可能是任何问题,所以我无法帮助您。我曾经遇到过类似的情况,其中一个公司域策略阻止了从zip文件中解压缩的EXE文件的运行。如果您没有这个问题,那么也许您的病毒扫描器正在干扰。在出现错误的情况下,您还可以尝试使用Process Monitor(从微软下载)来监视文件访问。 - James Wilkins

2
最终,我创建了一个新项目,并进行了MySQL.Data 6.9.9 | MySQL.Data.Entity 6.9.9 | Entity Framework 6.1.3的干净安装,然后尝试重新创建数据模型。

这几乎起作用了!但我遇到了一个错误:'System.Data.StrongTypingException: The value for column 'IsPrimaryKey' in table 'TableDetails' is DBNull. ---> System.InvalidCastException: Specified cast is not valid. 但许多人通过进入MySQL命令行并执行set global optimizer_switch='derived_merge=off'来解决此问题。您可以在此处找到此错误:https://bugs.mysql.com/bug.php?id=79163

出于某种原因,这有效。以下是我的命令行输出,以帮助任何MySQL新手:

enter image description here

这样就解决了所有问题!希望有人能发现这个方法,不要像我一样浪费时间。


0
确认一下,我已经通过在Visual Studio 2017(VS2017 => ver15.5.7)上使用这些精确的组件来完成了.net 4.7.1 asp.net-mvc5 web解决方案的所有工作,包括Entity Framework的db-first gui-tool-chain。此时,Visual Studio 2017已经完全更新。
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]

我尝试使用最新的MySql-Connector(版本6.10.x),但结果是VS2017的db-first方法的GUI工具根本无法工作。 我猜MySql-Connector必须与其余dll版本保持一致。

Web.config看起来像这样:

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

而App.config文件中托管.edmx文件的子项目如下所示:

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

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

注意:通过 [allowedVersions] 调整了 packages.config,以禁止 MySql 包意外自动升级到更高版本。这是为了避免影响 MySql nugets 的 6.10.x 版本存在的问题。

0

@James Wilkins 感谢您提供详细的答案,我要补充一点,在添加Mysql.data或MySQL.data.entity时,程序集版本有时会与MySqlConnector/Net安装的程序集不匹配。由于我们经常从Nuget下载最新的版本,这会再次引起问题。因此,我所做的是复制dll文件(Mysql.data、MySQL.data.entity和web)

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

将这些文件复制到我的应用程序的bin/debug文件夹中,并引用它们而不是从Nugets下载。这解决了我的问题。您还可能需要更新app.config或web.config和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">

并在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" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接