我正在使用带有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中。
解决方案是什么?我宁愿不必手动注释和取消注释该行,具体取决于我为哪个系统构建应用程序。
答案 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)子类。