ADO.NET 提供程序“Oracle.ManagedDataAccess.Client”未在计算机或应用程序配置文件中注册,或者无法加载

Posted

技术标签:

【中文标题】ADO.NET 提供程序“Oracle.ManagedDataAccess.Client”未在计算机或应用程序配置文件中注册,或者无法加载【英文标题】:The ADO.NET provider 'Oracle.ManagedDataAccess.Client' is either not registered in the machine or application config file, or could not be loaded 【发布时间】:2016-09-13 06:02:34 【问题描述】:

我正在使用.NET4.5.1MVC5EF6Oracle.ManagedDataAccess 4.121.1.0Oracle.ManagedDataAccess.EntityFramework 6.121.2.0

我能够从现有数据库生成模型(其中一部分是逐表添加),应用程序构建得很好。

但是当我尝试运行测试查询以查看它是否可以获取数据时

 public ActionResult Cancellations()
    
        var factoryClasses = System.Data.Common.DbProviderFactories.GetFactoryClasses();
        using (var db = new Entities())
        
            var cancelationStatuses = new[] 3, 7, 9;
           var result = db.TRANSACTIONDETAIL.Where(o => cancelationStatuses.Contains(o.TRANSACTIONSTATUSID));
           return View(result);
        
    

使用Unable to find the requested .Net Framework Data Provider. It may not be installed. 失败(在var result = ...

When trying to look forDbProviderFactories 确实没有收藏 (var factoryClasses =)。

但是I do have installed 12c 4 (ODTwithODAC121024)和11g(ODTwithODAC1120320_32bit),已经重启了机器。

数据库在 11g 上运行,我可以使用 PL/SQL developer 访问它

Web.config 如下所示:

<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
 <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
 <section name="Oracle.ManagedDataAccess.Client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</configSections>
.....
<connectionStrings>
.....
<add name="OracleDbContext" providerName="Oracle.ManagedDataAccess.Client" connectionString="User Id=oracle_user;Password=oracle_user_password;Data Source=oracle" />
 <add name="Entities" connectionString="metadata=res://*/OracleDb.csdl|res://*/OracleDb.ssdl|res://*/OracleDb.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string='data source=******" providerName="System.Data.EntityClient" />           </connectionStrings>
......
<system.data>
<DbProviderFactories>
  <!-- Remove in case this is already defined in machine.config -->
  <add name="Oracle Data Provider for .NET" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  <remove invariant="Oracle.ManagedDataAccess.Client" />
  <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>

我假设它失败了,因为 Oracle 没有在 DbProviderFactories 或其他地方注册

如何在 DbProviderFactories 中注册 Oracle?或者如果不是这种情况,我的设置有什么问题?

【问题讨论】:

您下载并包含Oracle.ManagedDataAccess.Client 库了吗? @PatrickHofman 是的,它在 nuget 参考版本 4.121.1.0 中 Oracle + MS = hell 我还是想不通 wtf 是错的 【参考方案1】:

我在更新 Visual Studio 2017 时遇到了这个错误。 可以通过为 VS 2017 重新安装 ODT 来解决该错误:

1) 关闭 Visual Studio。

2) 从控制面板卸载现有的 Oracle Developer Tools for Visual Studio 2017。

3) 从以下链接安装最新的 (ODTforVS2017_122011.exe):

http://www.oracle.com/technetwork/topics/dotnet/downloads/odacmsidownloadvs2017-3806459.html

4) 打开 Visual Studio 并构建解决方案。现在应该不会生成错误。

【讨论】:

这对我来说是解决方案。谢谢老哥! 这也是我的修复方法,ODTforVS2017 版本 18.3.0 ***.com/questions/44533943/…【参考方案2】:

想通了。

在我的machine.config 里已经有

<add name="Oracle Data Provider for .NET" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />

然后在我的web.config 中重复了它,这将默默地无法提供任何提供者。所以取出后:

  <add name="Oracle Data Provider for .NET" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  <remove invariant="Oracle.ManagedDataAccess.Client" />
  <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />

我让它运行起来了。

【讨论】:

【参考方案3】:

我通过从 NuGet 添加 ODP.NET (Oracle.ManagedDataAccess.EntityFramework 12c) 解决了这个问题。我正在使用 EF 6.2.0 运行 VS2015。

【讨论】:

我首先尝试了它,因为这看起来比删除“Oracle Developer Tools for Visual Studio 2017”答案更快,但它对我不起作用,然后我删除了 Oracle Developer Tools for Visual Studio 2017 并重新安装,它奏效了。【参考方案4】:

我刚刚通过安装 Oracle Developer tool for Visual Studio 2013(我安装的 VS 版本)解决了这个错误 ODTforVS2013_121025.exe

【讨论】:

以上是关于ADO.NET 提供程序“Oracle.ManagedDataAccess.Client”未在计算机或应用程序配置文件中注册,或者无法加载的主要内容,如果未能解决你的问题,请参考以下文章

无法加载具有不变名称“System.Data.SqlServerCe.4.0”的 ADO.NET 提供程序

使应用程序与多个 ado.net 提供商一起工作的最佳方法是啥?

MySQL 的非 GPL ADO.NET 提供程序?

64 位 .NET Informix ADO.NET 提供程序的程序集加载错误

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。