无法找到所请求的 .Net Framework 数据提供程序。可能尚未安装。

4
我知道对于这个错误已经有很多其他的帖子,但是没有一个能够为我的问题提供任何帮助或者指引。我正在使用与SqlExpress直接连接的方式,因此没有特殊的Oracle或MySQL数据库等。这似乎应该非常适合。
具体情况是这样的: 我创建了一个解决方案,包含几个项目; Repositories、Data(EF5.0)、Utilities、一个测试项目和一个MVC Web应用程序。目标是通过Data类通过Repositories项目访问底层SQL Express数据库,使用EF5和一些来自测试项目和MVC应用程序的repositories。
测试项目可以正常工作,并且能够无问题地访问和更新数据库。
然而, MVC Web项目却抛出"Unable to find the requested .Net Framework Data Provider. It may not be installed."的错误,我不理解,因为它使用的是与测试项目相同的连接字符串。
[ArgumentException: Unable to find the requested .Net Framework Data Provider.  It may not be installed.]
   System.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName) +1426271
   WebMatrix.Data.DbProviderFactoryWrapper.CreateConnection(String connectionString) +64
   WebMatrix.Data.<>c__DisplayClass15.<OpenConnectionStringInternal>b__14() +16
   WebMatrix.Data.Database.get_Connection() +19
   WebMatrix.Data.Database.EnsureConnectionOpen() +12
   WebMatrix.Data.Database.QueryValue(String commandText, Object[] args) +63
   WebMatrix.WebData.DatabaseWrapper.QueryValue(String commandText, Object[] parameters) +14
   WebMatrix.WebData.SimpleMembershipProvider.GetUserId(IDatabase db, String userTableName, String userNameColumn, String userIdColumn, String userName) +232
   WebMatrix.WebData.SimpleMembershipProvider.ValidateUserTable() +85

我已经在web.config中注册了System.Data.SqlClient。
根据这篇文章检查,确认已经安装了已注册的System.Data版本(2.0.0.0)。
确保连接字符串没有任何拼写错误。
以下是我在web.config文件中的配置...
  <connectionStrings>
    <add name="DBCatalogContext" 
         connectionString="metadata=res://*/DBCatalog.csdl|
                                    res://*/DBCatalog.ssdl|
                                    res://*/DBCatalog.msl;
                                    provider=System.Data.SqlClient;
                                    provider connection string=&quot;data source=.\SQLEXPRESS;
                                                                     initial catalog=DBCatalog;
                                                                     integrated security=True;
                                                                     multipleactiveresultsets=True;
                                                                     App=EntityFramework&quot;" 
         providerName="System.Data.EntityClient" />
  </connectionStrings>

  <system.data>
    <DbProviderFactories>
      <add name="SqlClient Data Provider" 
           invariant="System.Data.SqlClient" 
           description=".Net Framework Data Provider for SqlServer" 
           type="System.Data.SqlClient.SqlClientFactory, 
                 System.Data, 
                 Version=2.0.0.0, 
                 Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </DbProviderFactories>
  </system.data>

我看到的唯一不合理之处是,当我在“引用”文件夹下选择“System.Data”引用并查看其属性时,它显示为版本4.0.0.0,但当我在配置站点的“DbProviderFactories”部分更改版本后仍然出现错误。此外,我甚至没有看到该库的引用在测试项目中工作。
我相信这是一个疏忽或我遗漏了某些配置设置,但我不知道还能在哪里寻找解决方法,所以任何帮助都将不胜感激。
谢谢, G
2个回答

5

我最初发布时可能遗漏了一些关键信息。其中包括错误是由成员服务引发的事实;具体来说是...SimpleMembershipInitializer ...最初,这个类指定连接字符串..."DefaultConnection"在web.config中定义,用于初始化数据库连接。

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "Users", "UserId", "UserName", autoCreateTables: false);

我已经将它改为使用我在web.config中添加的“DBCatalogContext”连接字符串,认为我只会使用这个单一的连接字符串。当然,问题在于我添加的新连接字符串是一个Entity Framework连接字符串,而成员服务并不认识,导致数据提供程序错误。我只需添加回原始的常规连接字符串,再加上Entity Framework连接字符串,现在一切都正常了。好吧,至少与此问题相关的一切都正常了...
<connectionStrings>
    <add name="DBCatalogContext" 
         connectionString="metadata=res://*/DBCatalog.csdl|
                                    res://*/DBCatalog.ssdl|
                                    res://*/DBCatalog.msl;
                                    provider=System.Data.SqlClient;
                                    provider connection string=&quot;data source=.\SQLEXPRESS;
                                                                     initial catalog=DBCatalog;
                                                                     integrated security=True;
                                                                     multipleactiveresultsets=True;
                                                                     App=EntityFramework&quot;" 
         providerName="System.Data.EntityClient" />


    <add name="DefaultConnection" 
         providerName="System.Data.SqlClient" 
         connectionString="data source=.\SQLEXPRESS;initial catalog=DBCatalog;integrated security=True;multipleactiveresultsets=True;App=EntityFramework" />

  </connectionStrings>

我希望这篇文章对其他人有所帮助。


0

我遇到了完全相同的问题。 我正在做以下事情: 我扩展了UserProfile模型,添加了一个新属性Email

我认为我还必须在此调用中添加Email列:

WebSecurity.InitializeDatabaseConnection("AgileBoardDB", "UserProfile", "UserId", "UserName", "Email", autoCreateTables: true);

这从来没有起作用,我总是得到“...找不到提供程序”的错误。我尝试了所有的方法都没有成功。

结果发现EF足够聪明,自动创建了Email列,所以我从WebSecurity.InitializeDatabaseConnection中删除了额外的Email参数,现在一切正常。

PS:我正在使用相同的EF连接字符串连接到我的数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接