sql-server – “无法找到请求的.Net Framework数据提供程序.它可能没有安装.”

我知道有很多关于这个错误的帖子,但没有一个能够解决我的问题.我正在使用与SqlExpress的直接连接,因此没有特殊的Oracle或MySQL数据库或任何东西.看起来这应该像手套一样合适.

所以场景就是这样,我创建了一个由少数几个项目组成的解决方案;存储库,数据(EF5.0),实用程序,测试项目和MVC Web应用程序.目标是使用EF5以及测试项目和MVC应用程序中的一些存储库,通过数据类通过存储库项目中的存储库访问基础SQL Express数据库.

测试项目有效,能够访问和更新数据库,没有任何问题.

然而,MVC Web项目正在抛出“无法找到所请求的.Net Framework数据提供程序.它可能未安装.”错误,我不明白,因为它使用与测试项目相同的连接字符串.

[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)存在于每this article的GAC中
>确保连接字符串中没有拼写错误.

这是我在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>

我看到的唯一对我没有意义的是,当我在“References”文件夹下选择“System.Data”引用并查看属性时,它说它是版本4.0.0.0,但当我更改在配置站点的“DbProviderFactories”部分中的版本我仍然得到错误.另外,我甚至没有在Test项目中看到对该库的引用.

我相信这是一个疏忽或我错过了一些配置设置,但我不知道在这一点上还有什么其他的,所以任何帮助将不胜感激.

谢谢,
G

最佳答案
我最初发布时显然遗漏了一些最终相关的信息.这包括会员服务引发错误的事实;具体来说…… SimpleMembershipInitializer …最初这个类指定了连接字符串……在初始化数据库连接时使用的web.config中定义的“DefaultConnection”.

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

我已将其更改为使用我添加到web.config中的“DBCatalogContext”连接字符串,认为我将使用此单个连接字符串.当然,问题是我添加的新连接字符串是一个实体框架连接字符串,成员资格服务无法识别,导致数据提供程序错误.

除了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>

我希望其他人能发现这有用.

转载注明原文:sql-server – “无法找到请求的.Net Framework数据提供程序.它可能没有安装.” - 代码日志