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.1
、MVC5
、EF6
、Oracle.ManagedDataAccess 4.121.1.0
和
Oracle.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 提供商一起工作的最佳方法是啥?
64 位 .NET Informix ADO.NET 提供程序的程序集加载错误