2015-05-22 26 views
19

geladen werden Ich habe ein Projekt, das lokal arbeitet, auf unserem Entwicklungsserver und auf unserem Produktionsserver.Oracle .Net ManagedDataAccess Fehler: Der 'OracleInternal.Common.ConfigBaseClass' konnte nicht von Assembly

Wenn ich versuche, es auf dem Testserver auszuführen, erhalte ich den Fehler unten, und ich weiß nicht, was ich dagegen tun soll, um meinen Bildschirm leer zu starren. Hinweise? Prozess, um das Problem zu seiner Quelle zu verfolgen?

ich das NuGet Paket für Oracle 12.2 installiert haben, usw.

Could not load type 'OracleInternal.Common.ConfigBaseClass' from assembly 'Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342'. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.TypeLoadException: Could not load type 'OracleInternal.Common.ConfigBaseClass' from assembly 'Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342'.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[TypeLoadException: Could not load type 'OracleInternal.Common.ConfigBaseClass' from assembly 'Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342'.]
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: The type initializer for 'Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices' threw an exception.]
Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices.get_Instance() +24

Die Web.Config hat folgende Bausteine ​​darin:

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

UND

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

Hinweis: Es gibt andere Projekte, die auf diesem Server arbeiten, sie verwenden nur eine andere Version des Oracle-Clients für .Net. Keiner der anderen verwendet nur den verwalteten Treiber. Ich suche nach einer Möglichkeit, diesen Fehler zu untersuchen, einen Hinweis darauf, woher dieser Typ stammt und von welchem ​​er geladen wird.

+0

Wie Sie die Oracle-Bibliotheken installiert haben? – mason

+0

Mein Verständnis ist, dass Sie mit dem verwalteten Datenzugriff die Oracle-Bibliotheken nicht installieren müssen, der Zeiger auf sie ist in der Web.Config enthalten. Frage bearbeiten, um diese Information zu enthalten. –

+0

Ich meinte nicht den Oracle-Client. Ich meinte die von .NET verwendeten Oracle DLLs. Wie haben Sie diese installiert? – mason

Antwort

-1

Sie müssen die Oracle-Client-Treiber installieren. Die .NET-Pakete enthalten sie nicht; Sie bieten eine Übersetzung von der verwalteten Welt in die nicht verwaltete Welt. Die Treiber befinden sich in der nicht verwalteten Welt und müssen ordnungsgemäß installiert werden.

+0

Okay, das macht Sinn, aber heißt das, dass ich mich sowohl mit TNS-Problemen als auch mit Treiberversionsproblemen beschäftigen muss? –

+0

TNS ist eine Möglichkeit, wie der Treiber herausfinden kann, wie man sich mit dem verbindet, was man will, ja. –

+0

Ich würde das gerne eine Antwort nennen, aber es löst eigentlich nichts. Es gibt andere Projekte auf dem Server, die Oracle-Verbindungen verwenden, nicht nur die verwalteten. Wie kann ich dieses Problem beheben? Wo grabe ich? –

8

Es konnte behoben werden, indem Referenzen im Projekt zu Oracle.ManagedDataAccess und Oracle.ManagedDataAccess.EntityFramework von denen, die vom Paketmanager installiert wurden, zu denen ersetzt wurden, die vom Installationsprogramm des Oracle-Clients installiert wurden. Die Versionen sind die gleichen, aber die Build-Nummer unterscheidet sich in diesen DLLs

+0

Sie sagen also das NuGet-Paket ist unbrauchbar? Warum es dann benutzen? Warum existiert es überhaupt? Ist es eine Falle? Ich habe keinen Oracle-Client auf meinem Dev-Rechner und das NuGet-Paket funktioniert gut. Wenn Sie die App auf einem Computer bereitstellen, auf dem der Oracle-Server installiert ist, wird dieser Fehler behoben. – ygoe

+4

Ja, Oracle hat es wieder getan - sie haben die gleiche Version der DLL veröffentlicht (die ersten 3 Nummern sind genau gleich) und ändern die Implementierung ohne Abwärtskompatibilität. Sie haben es in der Vergangenheit getan (vor ungefähr 5 Jahren), also keine Überraschung für mich. Ich benutze jedoch das Nuget-Paket und dann auf dem Zielserver, dass ich ** Oracle.ManagedDataAccess DLL aus dem GAC entfernen **. Auf diese Weise wird die lokale (/ bin) Kopie der DLL verwendet. Sie müssen jedoch vorsichtig mit diesem Ansatz sein, wenn Sie andere Anwendungen auf dem Server haben, die dieselbe DLL verwenden, und sich auf die Tatsache verlassen, dass sie in der GAC vorhanden ist. –

+1

Eine Support-Person von Oracle hat empfohlen, dasselbe zu tun, und zukünftige Versionen sollten die Assembly nicht mehr in den GAC einfügen. Aber jetzt muss ich es manuell entfernen. Ohne gacutil.exe auf einer Nicht-Dev-Maschine, wie soll ich das machen? – ygoe

1

Es ist definitiv etwas seltsam mit diesem Problem. Ich habe eine App auf meinem lokalen Server entwickelt, die einwandfrei funktionierte, aber diese Fehlermeldung wurde angezeigt, als ich die App auf unseren Server hochgeladen habe. Der Server hat Oracle Client installiert. Nach dem Betrachten dieses Threads kopierte ich die zwei DLLs (Oracle.ManagedDataAccess.dll & Oracle.ManagedDataAccess.EntityFramework.dll) aus dem Oracle-Client und ersetzte die Versionen in meinem App Bin-Verzeichnis. Das hat das Problem behoben.

17

Sie müssen die Oracle.ManagedDataAccess Montage in Ihrem GAC entfernen (C: \ Windows \ Microsoft.NET \ assembly ...)

Use the command tool gacutil to remove the assembly:

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

+1

es hat für mich funktioniert. Danke. – Fatih

+1

+ Lösung funktioniert – Anton

+0

Das scheitert für mich, weil es sagt Windows Installer verwendet es. – vapcguy

17

Es gibt einen Konflikt zwischen Oracle.ManagedDataAccess von NuGet und diejenige, die auf einem Server installiert wird (durch Oracle-Client-Installation) und in GAC registriert ist.

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

Sie OraProvCfg.exe Datei finden sollte: Zeile und navigieren Sie zu dem Verzeichnis starten Befehl:

Unregister Oracle.ManagedDataAccess von GAC und Sie werden den Fehler beseitigen. Führen Sie den folgenden Befehl Oracle.ManagedDataAccess von GAC abzumelden:

OraProvCfg /action:ungac /providerPath:Oracle.ManagedDataAccess 
+0

Gibt es eine Dokumentation von Oracle, die das Problem erläutert? – youzer

+0

@youzer Nicht mir ist bekannt. –

+1

Zusammen mit vielen anderen stimme ich zu, dass Oracles Versionierung der eigentliche Schuldige ist. Die README-Datei _does_ des NuGet-Pakets besagt explizit "1. Un-GAC und die Konfiguration einer vorhandenen Assembly (d. H. Oracle.ManagedDataAccess.dll) und Richtlinien-DLL (d. h. Policy.4.121.Oracle.ManagedDataAccess.dll) für den ODP.NET, Managed Driver ... '(für mindestens Version 12.1.0.2). Die Antwort von @Jan hat bei mir mehrmals funktioniert, BTW. –

2

Wie bereits gesagt Sie Oracle.ManagedDataAccess von GAC entfernen müssen.

Ich betreibe {Oracle home}\product\12.1.0\dbhome_1\ODP.NET\managed\x64\unconfigure.bat und {Oracle home}\product\12.1.0\dbhome_1\ODP.NET\managed\x836\unconfigure.bat und es funktionierte

Verwandte Themen