共享主机 + 实体框架 + MySQL = 数据提供者错误?

Posted

技术标签:

【中文标题】共享主机 + 实体框架 + MySQL = 数据提供者错误?【英文标题】:Shared Hosting + Entity Framework + MySQL = Data Provider Errors? 【发布时间】:2011-05-17 15:43:39 【问题描述】:

长期聆听者,第一次来电者!

我正在尝试使用 ADO.NET 实体框架连接到 mysql。 (Visual Studio 2010,.NET 4.0)我创建了一个 Web 项目和另一个类库项目作为我的 DAL。在我的本地机器上,我没有问题,我也尝试过使用中等信任运行。我能够按预期完全控制数据库。

但是,当我部署到我的主机(共享、中等信任)时,我不断收到错误消息。我已经通过多种方式调整了我的 web.config:我在连接字符串中显式调用了我的程序集,我使用了通配符映射,我添加了对 MySQL dll 的引用等等。


<connectionStrings>
    <add name="NamespaceContext" connectionString="metadata=res:// Namespace.Data.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null/DataModel.csdl|res:// Namespace.Data.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null/DataModel.ssdl|res:// Namespace.Data.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null/DataModel.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=myserver;User Id=user;database=thedatabase;password=password;Persist Security Info=True&quot;" providerName="System.Data.EntityClient"/>
    <add name=" NamespaceContext " connectionString="metadata=res://*/;provider=MySql.Data.MySqlClient;provider connection string=&quot; server=myserver;User Id=user;database=thedatabase;password=password;Persist Security Info=True&quot;" providerName="System.Data.EntityClient"/>
        <add name=" NamespaceContext " connectionString="metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/DataModel.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot; server=myserver;User Id=user;database=thedatabase;password=password;Persist Security Info=True&quot;" providerName="System.Data.EntityClient" />
 </connectionStrings>

我不断收到的错误是:

System.ArgumentException: The specified store provider cannot be found in the configuration, or is not valid. ---> 
System.ArgumentException: Unable to find the requested .Net Framework Data Provider. It may not be installed. 
at System.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName) 
at System.Data.EntityClient.EntityConnection.GetFactory(String providerString) 
--- End of inner exception stack trace --- 
at System.Data.EntityClient.EntityConnection.GetFactory(String providerString)
at System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString)
at System.Data.EntityClient.EntityConnection..ctor(String connectionString)
at MyNamespace.Web.html.TestPage.EntityFrameworkTestButton_Click(Object sender, EventArgs e)

我与他们的支持人员(不是开发人员)进行了交谈,但他们说 MySQL 连接器已安装并在 GAC 中。我尝试在我的 web.config 中使用 DbProviderFactories 部分,如下所示:

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

我希望我可以控制它并在我的项目中引用提供者。然后我收到以下错误:

System.Data.MetadataException: Schema specified is not valid. 
Errors: error 0194: All artifacts loaded into an ItemCollection must have the same version. Multiple versions were encountered. 
MySql.Data.Entity.Properties.SchemaDefinition-6.0.ssdl(4,9) : error 0169: All SSDL artifacts must target the same provider. The ProviderManifestToken '5' is different from '5.0' that was encountered earlier. 
error 0194: All artifacts loaded into an ItemCollection must have the same version.

(为简洁起见,剪掉了许多相同的错误消息)


我完全不知所措。我尝试强烈签署我的 DAL 项目,而不是使用 DAL,而只是在 Web 项目中创建 .edmx,但都无济于事。我本可以发誓我在某个时候让它工作了,但也许我精神错乱了。

抱歉,墙上的文字。任何人都可以帮助或阐明一些问题吗?

谢谢!

【问题讨论】:

【参考方案1】:

如果将 mysql dll 放在 bin 文件夹中会怎样?或者,尝试删除对 mysql dll 的版本限制,他们可能没有在他们的服务器上加载确切的版本。

【讨论】:

我已将 dll 放在我的 bin 目录中,但没有运气。如何解除版本限制?如果我清除并删除,那不应该允许我使用我的版本吗? 只使用 type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" 而不是指定完整版本数据。还要更改 VS 中的设置,使其不针对特定版本进行构建 嘘!我不敢相信我在这么简单的事情上撞了我的头!非常感谢,我不知道你可以简单地放弃这个版本!【参考方案2】:

我在我的应用程序中遇到了一个非常相似的问题,我将 MySQL 连接器用于 MySQL 数据库,将 Entity Framework 用于 SQL Server 数据库(两个单独的连接,一个项目)。 MySQL.Data.Entity DLL 似乎与实体框架发生了冲突。我实际上并不需要它,所以我删除了它......但错误仍然存​​在!

最后出于绝望,我只是删除了我的 bin 和 obj 文件夹并重新编译。问题解决了。我猜有些东西被缓存或挂在我的文件夹中,即使在我运行干净并重建之后也是如此。如果其他人遇到这种情况,无论如何都要尝试一下。

【讨论】:

以上是关于共享主机 + 实体框架 + MySQL = 数据提供者错误?的主要内容,如果未能解决你的问题,请参考以下文章

集成测试共享数据库的多个实体框架 dbcontexts

如何让asp.net成员提供者和实体框架共享同一个数据库

实体框架,多个 edmx 共享连接字符串 - 可能吗?

实体框架 - 如何缓存和共享只读对象

rabbitmq原理

恢复尝试在共享主机中创建数据库的 MySQL 转储