VS 2017 中的 MySQL 和 MVC 实体框架不工作

Posted

技术标签:

【中文标题】VS 2017 中的 MySQL 和 MVC 实体框架不工作【英文标题】:MySQL and MVC Entity Framework in VS 2017 Not Working 【发布时间】:2018-01-10 03:56:33 【问题描述】:

我正在尝试启动 MVC EF Visual Studio 2017 项目。我在本地实例上使用 mysql 设置了所有数据连接,但是当我创建 ADO.net 数据模型时,出现图片中的错误:

这里还有另一篇文章:Can't use a MySQL connection for entity framework 6 涵盖了 VS 2012 和 2013,但不包括 2017。这里是 MySQL 文档,说明哪些版本适用于 2017:https://dev.mysql.com/doc/visual-studio/en/visual-studio-install.html

我正在使用:

MySQL 连接器网络 6.9.9 | MySQL for Visual Studio 1.2.7 | MySQL 服务器 5.7

MySQL.Data 6.9.9 | MySQL.Data.Entity 6.9.9 |实体框架 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>


编辑

我发现这篇文章https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html 谈到了设置连接,但现在不是那个错误,而是在我点击“下一步”时对话框就消失了。


这只是我做错了什么还是 MySQL 连接器损坏了?

提前感谢您的任何建议!

【问题讨论】:

您需要更新实体框架版本,因为它说您的项目比实体更新 @Ancient 我正在运行今天更新的 EF 6.1.3。 请将您的连接字符串添加到问题中 @derloopkat 还有什么我可以添加的可能有帮助的吗? 嗨,您是如何将 MySQL 安装到 Visual Studio 的?我正在使用 Visual Studio 2017 Enterprise 15.4.2 和 MySQL for Visual Studio 安装(使用 MySQL 安装程序或独立安装程序)失败。我尝试执行此解决方法 ==> bugs.mysql.com/bug.php?id=85908&thanks=3&notify=195 但 VS 的 MySQL 安装仍回滚到 90%。请帮忙,自从 3 天以来,我一直在努力从我的数据库中更新我的模型:/ 当我在新的连接窗口上单击“从数据库更新模型”时,没有显示 MySQL 数据库选项。请帮忙? 【参考方案1】:

所以最终我创建了一个新项目并全新安装了 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. ---&gt; System.InvalidCastException: Specified cast is not valid. 但是很多人已经通过进入 MySQL 命令行并执行:set global optimizer_switch='derived_merge=off' 解决了这个问题:你可以在这里找到这个错误:https://bugs.mysql.com/bug.php?id=79163

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

这可以解决所有问题!希望有人发现这不会像我那样浪费太多时间。

【讨论】:

【参考方案2】:

我要做的是重新安装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>

(您可能必须注释掉任何现有的部分并用这个替换它)

最后一步我不得不通过重新访问here 来提醒自己。 那部分是我忘记的(太长了),导致问题中的屏幕截图出现错误。

最后一件事,您可能将错误的版本复制到了 Visual Studio 的安装位置;例如:

C:\Program Files (x86)\Microsoft Visual Studio\\社区|企业|专业\Common7\IDE\PrivateAssemblies

C:\Program Files (x86)\Microsoft Visual Studio 您的版本号\Common7\IDE\PrivateAssemblies

MySql.Data.dll

MySql.Data.Entity.EF6.dll

MySql.Web.dll

(可能需要先关闭 Visual Studio)

您可以选择每个文件并转到文件属性下的Details 选项卡以查看您拥有的版本。

从此处(或您安装它的任何位置)获取新文件: C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.9\Assemblies\v4.5 (这假定使用框架 v4.5 的连接器 v6.9.9 [查看您的项目属性的Application-&gt;Target Framework 以确认您的设置])。

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

注意 2:如果您收到“IsPrimaryKey”错误,see here。

我已完成的 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>

【讨论】:

我按照您提到的每个步骤进行操作,现在我有一个使用 MySql EF 的 C# 项目......谢谢! 我正在使用 Visual Studio 2017 Enterprise 15.4.2 ,并且用于 Visual Studio 安装的 MySQL(使用 MySQL 安装程序或独立安装程序)即使使用开发版本也会失败。我尝试执行此解决方法 ==> bugs.mysql.com/bug.php?id=85908&thanks=3&notify=195 但安装仍回滚到 90%。请帮忙,自从 3 天以来,我一直在努力从我的数据库中更新我的模型:/ 当我在新的连接窗口上单击“从数据库中更新模型”时,没有显示 MySQL 数据库选项。 最好的办法是从头开始,卸载所有与 MySQL 相关的除了数据库,然后按照步骤按正确的顺序。如果没有按正确的顺序,事情将无法正常工作。至于您的安装程序失败,可能是任何事情,所以我无法帮助您。我确实遇到过类似的情况,公司域策略阻止了从 zip 文件中解压缩的 EXE 的运行。如果你没有,那么也许你有一个病毒扫描程序干扰。您还可以尝试使用 Process Monitor(从 MS 下载)来监控文件访问以防出错。【参考方案3】:

@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" />

【讨论】:

【参考方案4】:

通过在 .net 4.7.1 asp.net-mvc5 wev-solution 上使用这些确切的组件,调整以确认我得到了一切工作 - 包括 VS2017 中实体框架的 db-first gui-tool-chain Visual Studio 2017(VS2017 => ver15.5.7 也就是在撰写本文时完全更新的 VS2017):

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 (ver.6.10.x),但结果发现用于 db-first 方法的 VS2017 的 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>

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

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

注意:packages.config 已通过 [allowedVersions] 进行了有意调整,以禁止无意地将 MySql 包自动升级到其最新版本。这样做是因为躲避问题困扰着 6.10.x 风格的 MySql nugets。

【讨论】:

以上是关于VS 2017 中的 MySQL 和 MVC 实体框架不工作的主要内容,如果未能解决你的问题,请参考以下文章

如何让vs2017 EF实体生成支持Mysql 和 Oracle?

规范化创建一个vs2017 Mvc框架项目

VS 2017 + EF6 + MySQL5.7 建立实体模型闪退问题

VS2017在连接数据库,实体数据模型向导在选择完后点击下一步就闪退

如何将vs2017中的mvc 5项目发布到本地iis

RESTful架构中的webapi