Oracle .Net ManagedDataAccess错误:无法从程序集加载类型'OracleInternal.Common.ConfigBaseClass'

Dyl*_*ams 27 .net c# asp.net oracle entity-framework

我有一个在本地,我们的开发服务器和我们的生产服务器上工作的项目.

当我尝试在测试服务器上运行它时,我得到下面的错误,除了茫然地盯着我的屏幕,我不知道该怎么办.提示?将问题追溯到其来源的流程?

我已经为Oracle 12.2等安装了NuGet包.

无法从程序集"Oracle.ManagedDataAccess,Version = 4.121.2.0,Culture = neutral,PublicKeyToken = 89b483f429c47342"加载类型"OracleInternal.Common.ConfigBaseClass".描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.TypeLoadException:无法从程序集"Oracle.ManagedDataAccess,Version = 4.121.2.0,Culture = neutral,PublicKeyToken = 89b483f429c47342"加载类型"OracleInternal.Common.ConfigBaseClass".

来源错误:

在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.

堆栈跟踪:

[TypeLoadException:无法从程序集'Oracle.ManagedDataAccess,Version = 4.121.2.0,Culture = neutral,PublicKeyToken = 89b483f429c47342'加载类型'OracleInternal.Common.ConfigBaseClass'.]
Oracle.ManagedDataAccess.EntityFramework.EntityFrameworkProviderSettings.Oracle.ManagedDataAccess.EntityFramework .EFProviderSettings.IEFProviderSettings.get_TracingEnabled()+0 Oracle.ManagedDataAccess.EntityFramework.EFProviderSettings.InitializeProviderSettings()+111 Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices..ctor()+629 Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices..cctor()+ 28

[TypeInitializationException:'Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices'的类型初始值设定项引发异常.]
Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices.get_Instance()+24

Web.Config中包含以下块:

  <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>
Run Code Online (Sandbox Code Playgroud)

  <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="PVMDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=pdxcludds108.pacificorp.us)(PORT=11086))(CONNECT_DATA=(SERVICE_NAME=DDS1086.PACIFICORP.US))) " />
      </dataSources>
    </version>
  </oracle.manageddataaccess.client>
  <connectionStrings>
    <add name="OracleDbContext" providerName="Oracle.ManagedDataAccess.Client" connectionString="User Id=USERID;Password=WORKINGPASSWORD;Data Source=PVMDataSource" />
    <add name="PVMEntities" connectionString="metadata=res://*/Models.PVMModel.csdl|res://*/Models.PVMModel.ssdl|res://*/Models.PVMModel.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string=&quot;DATA SOURCE=pdxcludds108.pacificorp.us:11086/DDS1086.PACIFICORP.US;PASSWORD=XXXXXXX;PERSIST SECURITY INFO=True;USER ID=XXX&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
Run Code Online (Sandbox Code Playgroud)

注意:此服务器上还有其他项目,它们只是为.Net使用不同版本的Oracle客户端.其他人都没有使用托管驱动程序.我正在寻找一种方法来深入研究这个错误,一些暗示该类型的来源和加载方式.

Jan*_*las 25

Oracle.ManagedDataAccessNuGet与服务器上安装的(通过Oracle客户端安装)之间存在冲突,并且已在GAC中注册.

Oracle.ManagedDataAccess从GAC 取消注册,您将摆脱错误:运行命令行并导航到目录:

{Oracle home}\product\{version}\client_64\ODP.NET\managed\x64

你应该找到OraProvCfg.exe文件.运行以下命令以Oracle.ManagedDataAccess从GAC 取消注册:

OraProvCfg /action:ungac /providerPath:Oracle.ManagedDataAccess 
Run Code Online (Sandbox Code Playgroud)

  • 与许多其他人一样,我同意Oracle的版本控制是真正的罪魁祸首.也就是说,NuGet包的README文件_does_明确表示`1.Un-GAC并取消配置ODP.NET,托管驱动程序...的任何现有程序集(即Oracle.ManagedDataAccess.dll)和策略DLL(即Policy.4.121.Oracle.ManagedDataAccess.dll)(对于版本12.1.至少0.2.@Jan的回答曾多次为我工作,BTW. (3认同)

g.b*_*eze 20

您必须删除GAC 的Oracle.ManagedDataAccess程序集(C:\ Windows\Microsoft.NET\assembly ...)

使用命令工具gacutil删除程序集:

C:\ Program Files(x86)\ Microsoft SDKs\Windows\YOUR_VERSION\bin\NETFX 4.6.1工具> gacutil/u Oracle.ManagedDataAccess


Gre*_* Z. 8

能够通过将项目中的引用替换为Oracle.ManagedDataAccess和Oracle.ManagedDataAccess.EntityFramework从包管理器安装的那些引用到oracle客户端安装程序安装的引用来修复它.版本相同,但这些DLL上的内部版本号不同

  • 是的,Oracle再次做到了 - 他们发布了相同版本的DLL(前3个数字完全相同)并且在没有向后兼容性的情况下更改了实现.他们在过去(大约5年前)这样做了,所以对我来说并不奇怪.我确实使用Nuget包然后在目标服务器上我确保**从GAC中删除**Oracle.ManagedDataAccess dll.这样它将开始使用DLL的本地(/ bin)副本.如果服务器上有其他应用程序使用相同的DLL并依赖于GAC中存在的事实,则必须小心这种方法. (4认同)

Too*_*kit 5

正如其他人所说,您需要从GAC中删除Oracle.ManagedDataAccess。

我运行{Oracle home}\product\12.1.0\dbhome_1\ODP.NET\managed\x64\unconfigure.bat,并{Oracle home}\product\12.1.0\dbhome_1\ODP.NET\managed\x836\unconfigure.bat 和它的工作


sim*_*rcl -1

您需要安装 Oracle 客户端驱动程序。.NET 包不包含它们;它们提供了从托管世界到非托管世界的转换。驱动程序处于非托管环境中,需要正确安装。