实体框架向导在 MySQL 上崩溃

Posted

技术标签:

【中文标题】实体框架向导在 MySQL 上崩溃【英文标题】:Entity Framework wizard crashes on MySQL 【发布时间】:2015-03-24 06:33:31 【问题描述】:

我的问题类似于this one,但崩溃发生在稍后。我必须在 SQL Server 和 mysql 之间互操作 EF 数据库优先模型。更具体地说,我的应用程序根据连接字符串和配置设置(DB_TYPE=MYSQL 等)向 SQL Server 或 MySQL 发起了普通 SQL 查询,两个数据库具有相同的结构并一起维护,因此对一个架构的每次修改都是重新应用到另一个。

现在我使用 SQL Server 数据库优先模型向应用程序添加了 EF 支持。我现在必须也让应用程序在 MySQL 上运行。为了验证老开发人员没有在两个 DBMS 之间留下任何不一致的地方,我尝试Update model against database*,这次我选择了 MySQL 连接到我在 localhost 上的开发数据库。

在我点击下方屏幕上的Next 后,它会简单地崩溃并返回到 EDMX 编辑器

我需要继续这个项目,我已经坚持了一段时间了。

这是我的 Web.config 片段:

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <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.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>

如何解决我的问题?我为 Visual Studio 重新安装了 MySQL 工具,但没有帮助。

*我使用的是本地化版本的 Visual Studio,所以我不知道所有命令的英文原版

【问题讨论】:

我遇到了类似的问题。你有没有找到解决办法? 我知道这不是一个答案,但 Database First 并不是访问不同 DBMS 类型的好方法。在 EF7 中不再支持,EF 提供程序很难编写,并且经常会出现类似您的问题。最好的方法是使用 CodeSmith 或类似工具从数据库生成类,然后继续使用 Code First 方法。 任何日志中的任何错误? 这有关系吗? Entity Data Model Wizard crashes on Specify connection string dialog @bubi 对不起,我完全不同意。代码优先对于大型项目和关系数据库来说是一个糟糕的解决方案,并且可以生成需要数百个查询连接的可怕表集。 Database First 允许数据库被视为一等公民,并给予其良好运行所需的所有关心和关注。我参与过许多代码优先项目,都遇到过重大问题。 【参考方案1】:

我不知道为什么会这样,但我进入了我的 NuGet 包管理器并删除了 MySql.Data.Entity(还检查了删除 MySql.Data 的依赖项)。我进入我的 .edmx 并运行“从数据库更新模型...”,一切正常。

(注意:这也删除了我的实体框架,因此我必须使用 NuGet 管理器重新添加它)

W...T...F?

也许其他人可以证实这一点......

【讨论】:

您能否重现(例如,从源代码中签出早期版本...?)并确认要删除哪些包?所以我们可以在我们这边重现并确认。实际上,您的看起来更像是一个困惑用户的评论。我建议做个短暂的呼吸并进行调查。顺便说一下,MySQL 软件包自第零日起就升级了 是的,我实际上每天都能重现这个。 MySql 连接随机停止工作,为了解决这个问题,我必须使用 NuGet 卸载并重新安装包。如果您知道任何错误日志,我可以查看我很想找出导致此问题的原因。【参考方案2】:

已在another thread回复,典型的崩溃原因是MySQL连接器和MySQL.Data.Entity的版本不匹配。

您得到错误版本的最可能的原因是包名称从 MySQL.Data.Entity 更改为 MySql.Data.EntityFramework

我花了很多时间尝试线程中的答案,仅供参考。

【讨论】:

谢谢。我安装了更新版本的 MySql.Data 包并将 MySql.Data.Entity 替换为 MySql.Data.EntityFramework(与 MySql.Data 的版本相同)并且它有所帮助。【参考方案3】:

当您环顾四周时,这似乎是一个常见问题。我知道沿着这条路走,但迟到总比不做好。

我最终删除并重新安装了 Visual Studio 2015 和 mysql,然后从头开始。然后,我确保我完成了整个过程,只引入了需要的东西。

    使用 nuget 安装 MySql.Data 6.9.9 和 MySql.Data.Entity 6.9.9。没有别的了。 Nuget 未正确更改 Web 配置,因此您需要进行如下更改。

之前

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
         <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
     </providers>
</entityFramework>

之后

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

这为我解决了问题。我不确定您是否需要重新安装,但您肯定需要执行第 2 步。

祝你好运。

【讨论】:

值得一试【参考方案4】:

我按照以下步骤解决了这个问题(请注意,我使用的是 vs2015 和 .net 4.5)

1) 卸载所有以前的 mysql 连接器

2) 通过 NuGet 包删除所有 mySQL 引用

3) 下载mysql连接器v6.8.8

4) 下载后,转到您的项目并添加新安装的 dll 文件作为参考(位于安装路径中,通常为 C:\Program Files (x86)\MySQL\MySQL Connector Net 6.8.8\Assemblies \v4.5)

5) 转到您的 NuGet 包并添加 MySql.Data(6.8 版)和 MySql.Data.Entity(6.8 版)。

6) 构建您的解决方案,不再崩溃 :)

希望对你有所帮助

【讨论】:

这是我能找到的唯一解决方案,我花了几个小时来解决这个特殊问题。惊人的!太感谢了!你是救生员。【参考方案5】:

对于仍然遇到此问题的任何人,这里是我必须安装才能使其正常工作的版本:

适用于 Visual Studio 的 MySQL:2.0.5(请注意,在发布最新的通用版本时是 1.2.9 - 您需要转到“开发版本”选项卡以获取版本 2.0.5 -https://dev.mysql.com/downloads/windows/visualstudio/ )

MySQL 连接器/NET:6.9.11 (https://downloads.mysql.com/archives/c-net/)

MySQL.Data NuGet 包:6.9.11(安装包 MySql.Data -Version 6.9.11)

MySQL.Data.Entity NuGet 包:6.9.11(安装包 MySql.Data.Entity -Version 6.9.11)

(请注意,我不必调整配置文件。)

希望对你有帮助。

【讨论】:

其中一些版本不再显示在 NuGet 包管理器界面中,但如果您将条目放入命令行控制台,它们仍然可以工作。以及 Install-Package MySql.Web -Version 6.9.11 如果你需要的话。【参考方案6】:

问题在于 MySQL、Visual Studio、连接器和 MySQL for Visual Studio 的兼容性。


    关闭 Visual Studio。 您需要卸载 MySQL Connector 和 MySQL for Visual Studio。 (重新启动计算机) 如果您有两个版本的 Visual Studio,它只能在其中一个中工作。所以选择你想要的。

    安装正确的版本。 (重新启动计算机)。

    Visual Studio 2019(社区版、专业版和企业版) - MySQL for Visual Studio 1.2.9 with Connector/NET 8.0.14 Visual Studio 2017(社区版、专业版和企业版): -MySQL for Visual Studio 1.2.7 with Connector/NET 6.9.9 Visual Studio 2015(社区版、专业版和企业版): -MySQL 适用于带有连接器/NET 6.9.8 的 Visual Studio 1.2.7 或 2.0.2

    打开 VS 并构建您的项目,然后尝试更新您的实体

实际上我正在使用 VS Professional 2017 和这个掘金 MySql.Data 6.9.9 和 MySql.Data.Entity 6.9.9(MySQL for Visual Studio 1.2.7 with Connector/NET 6.9.9)

【讨论】:

【参考方案7】:

就我而言,问题在于特定版本的 MySQL 服务器。因此,我已经卸载了所有内容并使用这些版本进行了全新安装。

这是与 VisualStudio 2019 社区一起使用的设置:

    关闭 VisualStudio

    卸载(从 Windows 控制面板):

    适用于 VisualStudio 的 MySQL MySQL 连接器网络 MySQL 服务器

    检查 PrivateAssemblies 文件夹并删除所有 MySQL.* 程序集:

    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\PrivateAssemblies

    如果需要,请安装 MySQL 服务器版本 5.7.33

    Workbench 可以是任何版本。 设置您的服务器。

    安装MySQL Connector Net 6.8.8

    此版本在 MySQL 档案中不可用。你可以找到镜像寻找名字:mysql-connector-net-6.8.8.msi

    安装 MySQL for VisualStudio 1.2.8

此时,你可以打开VS并测试EntityFramework模型的生成

构建和运行:

    从文件夹中引用所需的程序集:

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

    确保您的项目目标框架版本与 MySQL 程序集兼容 (v4.5)

    在您的配置文件中查找 MySQL 引用以指向版本 6.8.8

参考资料:

Nassif Bousaba answer https://bugs.mysql.com/bug.php?id=89338

【讨论】:

【参考方案8】:

好吧,我可以告诉你,连接器 8.0.xxx 和 MySQL 为 MySql Server 8 推出的所有 8.0.xxx dll 都彻底失败了。

一年多来,https://bugs.mysql.com/bug.php?id=91030&thanks=3&notify=195 出现了一个重大错误。

如果您尝试使用 MySql 8.0,许多连接器和库都会给您一个错误....

“提供者没有返回 ProviderManifestToken 字符串。”

这证明了在 mysql dll 的连接器和文档中应用的 Visual Studio 支持、文档、测试和基本开发技能绝对低于零水平,这是我在清醒生活的最后 40 小时里试图整理的工作模型让我的应用程序与 MySql 8.0.16 连接并拥有一个工作实体框架向导。在这一点上,我几乎希望我使用 SQL Server 开发它。

我正在使用 ASP.NET Identity 2.0 的变体,这是我在尝试登录时会返回的内容

“提供者没有返回 ProviderManifestToken 字符串。”

无论如何,这就是我要为我工作的地方。

这是我必须在 Windows 10 上使用 Server 8.0 的东西,它可以建立连接并允许使用 ASP.NET Identity 2.0 登录,并且至少会运行数据实体向导以完成。

安装连接器/网络 6.10.7

DLL 的

c:..\EntityFramework.6.2.0\lib\net45\EntityFramework.dll

C:..\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll

C:..\MySql.Data.6.10.7\v4.5.2\MySql.Data.dll

C:..\MySql.Data.6.10.7\v4.5.2\MySql.Data.Entity.EF6.dll

Web.Config

<configSections>
    <section name="entityFramework"type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral,publicKeyToken=b77a5c561934e089" requirePermission="false" />      
    </configSections>

<connectionStrings>
 <add name="DefaultConnection" connectionString="server=localhost;user id=<yourid>;password=<yourpassword>;persistsecurityinfo=True;database=<yourdbname>" providerName="MySql.Data.MySqlClient" />
   </connectionStrings>


<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  <providers>

     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
 <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
        </providers>
</entityFramework>

<system.data>
   <DbProviderFactories>
       <remove invariant="MySql.Data.MySqlClient"></remove>
      <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.10.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
</system.data>


我希望这可以帮助一些人,但我有一种有趣的感觉,你的里程可能会有所不同。

【讨论】:

我开始理解那个申请软件工作并被录用的人,修复了一个让他作为用户感到沮丧的错误,然后辞职。 @LiterateCorvette 确实如此。我刚刚回到它并找到了这个链接。 c-sharpcorner.com/article/…在炎热的夏日像凉风一样工作【参考方案9】:

我遇到了类似的问题。安装“MySql.Data 6.9.9”和“MySql.Data.Entity 6.9.9”Nuget 包后,向导在该屏幕后崩溃。我附加了一个调试器,发现它是由 MySql.Data.Entity.EF6.dll 中的空引用异常引起的。

我认为它可能不是软件包,因为我已经尝试重新安装它们,所以我认为这可能是 Visual Studio 的 MySQL 安装与 MySQL EF6 dll 冲突的问题。我的解决方案只是重新安装最新的“MySQL for Visual Studio 1.2.6”:

http://dev.mysql.com/downloads/windows/visualstudio/

可能是我有一个旧版本(没想到先检查,所以我无法确认)。

【讨论】:

【参考方案10】:

在我的情况下,原因是安装的 mysql 连接器的版本与引用的 MySQL.Data.Entity 的版本不同 当我引用相同的版本时,一切都好了。

【讨论】:

【参考方案11】:

不确定链接将如何保留,但这对于 .net 核心非常有效。

https://www.c-sharpcorner.com/article/tutorial-use-entity-framework-core-5-0-in-net-core-3-1-with-mysql-database-by2/

总而言之,诀窍似乎是使用

Microsoft.EntityFrameworkCore (v5.0.0 – the latest stable version)
Microsoft.EntityFrameworkCore.Tools (v5.0.0 – the latest stable version)
Pomelo.EntityFrameworkCore.MySql (version 5.0.0-alpha.2)

在您的包管理器中。做得很流畅。

我对 Pomelo 以外的其他版本非常不满意。

使用 MySQL Connector Net 6.10.7 和 Server 8.0

【讨论】:

BrownPony,欢迎提供解决方案的链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么存在,然后引用在目标页面不可用的情况下,您链接到的页面中最相关的部分。 Answers that are little more than a link may be deleted. @Shree 我添加了我认为是这篇文章的精髓。发帖太长了。如果您认为应该删除它,那么我可以接受。【参考方案12】:

我从

更改配置文件
<entityFramework>.....</entityFramework>

<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">.....</entityFramework>

一切正常

参考:https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html

【讨论】:

以上是关于实体框架向导在 MySQL 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 的实体数据向导在连接 MySQL 数据库时崩溃

使用 MySQL 和实体框架 6 StrongTypingException 错误

无法将实体框架与 MySQL 一起使用

具有 SQL Server 连接的实体框架 6 尝试使用 MySqlClient 并崩溃

EF6+MySql 软件配置环境 EF连接不到mysql问题 实体数据模型向导 选不到mysql

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