【问题标题】:"Unable to find the requested .Net Framework Data Provider. It may not be installed."“找不到请求的 .Net Framework 数据提供程序。它可能未安装。”
【发布时间】:2013-01-22 02:54:11
【问题描述】:

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

所以场景是这样的,我创建了一个由几个项目组成的解决方案;存储库、数据 (EF5.0)、实用程序、测试项目和 MVC Web 应用程序。目标是通过使用 EF5 的 Repositories 项目中的存储库以及来自测试项目和 MVC 应用程序的一些存储库,通过 Data 类简单地访问底层 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

我有...

  1. 在 web.config 中注册了 System.Data.SqlClient。
  2. 根据this article 验证了 GAC 中存在 System.Data 的注册版本 (2.0.0.0)
  3. 确保连接字符串中没有拼写错误。

这是我在 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”部分更改了版本,但仍然出现错误。此外,我什至没有在有效的测试项目中看到对该库的引用。

我确信这是一个疏忽,或者我缺少一些配置设置,但我不知道在这一点上还能看到哪里,所以任何帮助都将不胜感激。

谢谢, G

【问题讨论】:

    标签: sql-server asp.net-mvc dataprovider


    【解决方案1】:

    我最初发布时显然遗漏了一些最终相关的信息。这包括会员服务抛出错误的事实;特别是 ... SimpleMembershipInitializer ... 最初这个类指定了连接字符串 ... "DefaultConnection" 在 web.config 中定义,在初始化数据库连接时使用。

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

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

    除了实体框架连接字符串之外,我只是简单地添加了原始的常规连接字符串,现在一切正常。好吧,与这个问题有关的一切......

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

    我希望其他人会发现这很有帮助。

    【讨论】:

      【解决方案2】:

      我遇到了完全相同的问题。 我正在执行以下操作: 我扩展了UserProfile 模型以拥有一个新属性Email

      虽然我还必须在此调用中添加 Email 列:

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

      这从来没有奏效,我总是得到“... Provider not found”。我尝试了一切都没有运气。

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

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

      【讨论】:

        猜你喜欢
        • 2011-06-29
        • 1970-01-01
        • 2014-02-05
        • 1970-01-01
        相关资源
        最近更新 更多