.NET MySQL连接器冲突DbProviderFactories

时间:2011-09-08 20:31:54

标签: c# .net mysql mysql-connector

我正在使用带有Entity Framework 4的.NET MySQL连接器,一切都运行良好,但我想在部署在服务器上时使用我的应用程序打包MySQL客户端DLL文件,因此我们不必担心安装mysql每个服务器,每个应用程序都将拥有所需的正确副本。

为了实现这一点,我确保MySQL引用设置了“Copy Local”,这样它们就会被复制到bin文件夹并将以下内容添加到我的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, Version=6.3.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
</system.data>

这样可以部署应用程序而无需在远程服务器上安装mysql,但现在我的本地开发机器上出现问题(我安装了MySQL连接器),当EF尝试连接时,我收到此错误:

  

列'InvariantName'被限制为唯一。值   'MySql.Data.MySqlClient'已存在。

如果我在app.config中注释掉我上面添加的XML,那么错误就会消失。这可能是因为系统上安装了相同的驱动程序并且位于machine.config中。

解决方案是什么?我宁愿不必手动注释和取消注释该行,具体取决于我为哪个系统构建应用程序。

2 个答案:

答案 0 :(得分:45)

尝试添加&lt;在webconfig中删除invariant =“MySql.Data.MySqlClient”/&gt; 。在您的计算机上,您已安装Connector for MySql,并且已通过在DbProviderFactories中添加项目来修改machine.config。因此,如果您在web.config中添加了另一个MySql数据提供程序,那么就像您尝试两次注册相同的内容一样。

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

答案 1 :(得分:0)

您还可以考虑将C:\Program Files (x86)\MySQL\MySQL Connector Net 6.8.3\Assemblies\v4.0中的所有mysql DLL复制到项目的bin文件夹中。通过这种方式,EF6可以到达所有必需的MySQL连接器(MySql.Data)子类。