具有不变名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序未在机器或应用程序配置文件中注册

Posted

技术标签:

【中文标题】具有不变名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序未在机器或应用程序配置文件中注册【英文标题】:The ADO.NET provider with invariant name 'MySql.Data.MySqlClient' is either not registered in the machine or application config file 【发布时间】:2016-11-22 00:23:18 【问题描述】:

我有一个使用实体框架 6 到 mysql 服务器的 asp.net 解决方案。

现在我必须在新机器上解决这个问题, 但我有一些问题: 1) 构建解决方案时出现错误:“具有不变名称'MySql.Data.MySqlClient' 的 ADO.NET 提供程序未在机器或应用程序配置文件中注册”。

App.config:

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

2) 打开 model.edmx 文件时,我收到消息:“实体模式设计器无法显示您请求的文件”。

我已经在机器上安装了:

1) mysql 连接器/网络 6.9.9 2) Visual Studio 1.2.6 的 mysql 3) mysql 连接器 odbc 5.3.6.

我能做什么?

【问题讨论】:

【参考方案1】:

我遵循了互联网上大多数建议的解决方案,但很抱歉所有都失败了。出现问题是因为 Visual Studio 缺少 MySql 连接器,我通过安装 mysql-connector-net-7.0.4 (https://downloads.mysql.com/archives/c-net/) 解决了它

【讨论】:

我正在使用 VS 2015 和一个全新的 MVC 5 应用程序。我尝试了其他所有方法,但仍然无法查看 edmx。这是我在断断续续尝试解决问题几天后尝试的最后一件事。这成功了。一旦 msi 完成,edmx 图形界面就栩栩如生。非常感谢! @iQalalwa 安装后怎么办?我现在应该采取什么步骤? @faisal 重启你的视觉工作室后一切都必须正常。没有更多的步骤 我在这里问了一个相关问题:Why do I still need the MySQL Connector installed on the computer despite having the proper NuGet packages? 同样,MySQL .NET 连接器未安装到 GAG 中。我使用 MySQL Installer 软件,从那里安装它,然后用 Visual Studio 中的模型设计器打开文件。【参考方案2】:

它适用于 app.config 中的以下部分:

<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" />
    </DbProviderFactories>
</system.data> 

【讨论】:

【参考方案3】:

我的机器上没有安装任何 MySql 连接器。 通过安装 nuget 修复它:MySql.ConnectorNET.Entity

【讨论】:

【参考方案4】:

上述解决方案对我不起作用。但是,受this answer 的启发,我能够通过删除我的Web.config 文件中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>

变成:

    <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">
        </provider>
      </providers>
    </entityFramework>

ETA:正如this follow-up 中所指出的,可能还需要在Web.config 文件中手动编辑MySql.Data 的版本:

<dependentAssembly>
    <assemblyIdentity name="MySql.Data" culture="neutral" publicKeyToken="c5687fc88969c44d" />
    <bindingRedirect oldVersion="0.0.0.0-6.9.9.0" newVersion="6.9.9.0" />
</dependentAssembly>

【讨论】:

【参考方案5】:

我已经做了很多谷歌并找到了解决方案 确保 MySQL.Data.dll、MySQL.Web.dll、MySQL.Data.Entity.dll 和 System.Data.Entity.dll 都被复制到本地(右键单击程序集并确保 Copy Local 设置为 true) 当我尝试调试此问题时,我还在本地添加了以下内容,但这可能是不必要的 System.Data.dll [可能是可选的] System.Data.Entity.Design [可能是可选的]

这是您在 google 或 AppHarbor 上的许多地方都不会读到的步骤! 将以下内容添加到您的 web.config 文件中:

  <system.data>
  <DbProviderFactories>
    <clear />
    <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.4.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
  </DbProviderFactories>
</system.data>

【讨论】:

【参考方案6】:

我能够通过仅将属性“DbConfigurationType”添加到我的上下文类来解决它,我在我从某个地方获得的代码示例中找到了它,但不记得起源很抱歉。它与 Dmitry 的答案相同,但使用属性作为实现

[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class MySqlWeatherContext : DbContext

    public MySqlWeatherContext() : base("context")

    public DbSet<Measurepoint> Measurepoints  get; set; 

这是我的配置文件:

<?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" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
  </startup>
  <connectionStrings>
    <add name="context" providerName="MySql.Data.MySqlClient" connectionString="" />
  </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.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </providers>
  </entityFramework>
</configuration>

【讨论】:

【参考方案7】:

为了解决这个问题,除了this post中列出的更改之外,我还不得不手动编辑web.configMySql.Data的版本,如下所示:

<dependentAssembly>
    <assemblyIdentity name="MySql.Data" culture="neutral" publicKeyToken="c5687fc88969c44d" />
    <bindingRedirect oldVersion="0.0.0.0-6.9.9.0" newVersion="6.9.9.0" />
</dependentAssembly>

【讨论】:

为什么在安装 v6.9.9 时不会自动更新?这解决了我的问题。很好的收获。【参考方案8】:

您必须添加 codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6" 到您的配置文件中或在应用程序启动时调用 DbConfiguration.SetConfiguration(new MySqlEFConfiguration())

【讨论】:

【参考方案9】:

从引用列表中删除 MySql.Data.Entity.EF6 的旧引用。通过 Nuget 包管理器重新安装,它将工作/

【讨论】:

【参考方案10】:

添加到您的 web.config

<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.EntityFramework" />
</providers>

在当前上下文类中添加 DbConfigurationType 属性

[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class MeuContexto: DbContext  

【讨论】:

以上是关于具有不变名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序未在机器或应用程序配置文件中注册的主要内容,如果未能解决你的问题,请参考以下文章

具有不变名称“System.Data.SqlServerCe.4.0”的 ADO.NET 提供程序未注册

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序

错误:找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序

具有不变名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序未在机器或应用程序配置文件中注册