2012-03-28 8 views
8

Sto cercando di capire se è possibile distribuire un'app MVC, EF, ODAC 11.2.0.3 su un server con una versione precedente di ODP.NET installata . Invece di aggiornare il sever ODP.NET (che non posso), ho pensato di poter utilizzare Oracle Instant Client.Problemi di Oracle Instant Client ed Entity Framework con la configurazione

È fattibile?

1) ho aggiunto queste DLL per il mio progetto per supportare client di instant

-Oracle.DataAccess.dll

-oci.dll

-ociw32.dll

-orannzsbb11. dll

-oraociei11.dll

-OraOps 11w.dll

2) Poi ho web.config aggiornato per le DbProviderFactories

<system.data> 
    <DbProviderFactories> 
    <add name="Oracle Data Provider for .NET" 
    invariant="Oracle.DataAccess.Client" 
    description="Oracle Data Provider for .NET" 
    type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
    </DbProviderFactories> 
    </system.data> 

3) Questo (afaik) è come usare la dll Oracle nel rathre bin rispetto al GAC

<runtime> 
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
    <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" /> 
    <publisherPolicy apply="no" /> 
    </dependentAssembly> 
</assemblyBinding> 
</runtime> 

4) Infine la mia connectionString

<connectionStrings> 
    <add name="Entities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=Oracle.DataAccess.Client; 
provider connection string=&quot;DATA SOURCE=XXX;PASSWORD=XXX;PERSIST SECURITY INFO=True;USER ID=XXX&quot;" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 

Questo è l'errore che ricevo Unabl e per trovare il provider di dati Framework .Net richiesto. Non può essere installato.

Apprezzo davvero qualsiasi aiuto qui. Sono piuttosto nuovo e ho molto da imparare. Grazie in anticipo. applausi

+1

Hai scaricato la versione XCOPY? Hai visto cosa stanno facendo i file install.bat e configure.bat all'interno del file zip XCOPY? Inizia semplicemente eseguendo questi file in base al readme prima di provare a fare le cose manualmente. –

+0

Ciao cristiano, ho usato il programma di installazione universale per ODAC 11.2 versione 4 (11.2.0.3.0) e per il client istantaneo ho scaricato quel pacchetto e copiato le dll nel mio progetto. – Mustang31

+0

Si prega di scaricare l'installazione XCOPY invece. È progettato esattamente per evitare il problema in cui ti trovi ora (copia delle DLL e configurazione senza nessuna guida) –

risposta

3

Aggiungere una sezione <remove … /> nell'elemento <DbProviderFactories> nella configurazione Web per rimuovere qualsiasi provider Oracle esistente. (Prima del <add>)

<remove invariant ="Oracle.DataAccess.Client" />

+0

Questo ha fatto il trucco Jeremy. Penso di aver avuto anche le dll sbagliate, come ha sottolineato Christian. grazie ancora a tutti per il vostro aiuto! – Mustang31

+0

Questo ha risolto il mio problema anche su un server Windows 2012. Grazie. –

+0

Per chi esegue questa operazione perché riceve una ConfigurationException su InvariantName su Oracle.DataAccess.Client: modifica il file machine.config per rimuovere i duplicati. – thomasb

1

Sembra dalla tua domanda che è necessario distribuire un aggiornamento per l'applicazione e la nuova versione di ODP.net utilizzando solo il permesso di distribuzione xcopy.

Poiché l'applicazione è in fase di modifica, non è necessario apportare modifiche all'associazione all'assemblaggio o DbProviderFactories. Basta aggiornare il csproj della libreria di classi con il edmx ecc per avere un riferimento alla nuova versione ODP.net, ad esempio

<Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86" /> 

Se si ottiene un problema con il tnsnames.ora, allora si dovrebbe fare uno dei seguenti modi: a) Aggiungere un ambiente di sistema TNS_ADMIN variabile punti alla directory del tnsnames.ora, o b) Modificare la stringa di connessione a qualcosa in base a:

Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));User Id=myUsername;Password=myPassword; 

c) Vedi se puoi mettere una copia di tnsnames.ora da qualche altra parte.

+0

Ciao Arieh, penso di non essere stato chiaro con la mia domanda. Si tratta di una nuova webapp che utilizza Oracle Instant Client con l'ultimo ODAC di Oracle con supporto EF. Voglio distribuire questo a un server che non ha l'odp.net più recente installato – Mustang31

1

Ecco la mia soluzione Xcopy.

ho postato sopra a

(https://jeremybranham.wordpress.com/2011/04/25/oracle-instant-client-with-odp-net/#comment-181)

pure.

Ma credo di poter pubblicare la mia XML senza problemi di formattazione qui.

Nuget "packages.config"

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="CommonServiceLocator" version="1.0" targetFramework="net35" /> 
    <package id="EnterpriseLibrary.Common" version="5.0.505.0" targetFramework="net35" /> 
    <package id="EnterpriseLibrary.Data" version="5.0.505.0" targetFramework="net35" /> 
    <package id="EntLibContrib.Data.OdpNet" version="5.0.505.0" targetFramework="net35" /> 
    <package id="Unity" version="2.1.505.2" targetFramework="net35" /> 
    <package id="Unity.Interception" version="2.1.505.2" targetFramework="net35" /> 
</packages> 

app.config

(si noti il ​​tag <clear /> di sotto. Questo può o non può essere necessario, ma ho pensato che era meglio per eliminarli fuori dal non si sa quello che potrebbe essere nel file machine.config)

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    </configSections> 


    <dataConfiguration defaultDatabase="OracleMainConnectionString"> 
    </dataConfiguration> 

    <connectionStrings> 

    <add name="OracleMainConnectionString" 
     connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyOracleServerName)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MyServiceName)));User ID=MyUserName;Password=MyPassword;" 
     providerName="Oracle.DataAccess.Client" /> 
    </connectionStrings> 

    <appSettings> 
    <add key="ExampleKey" value="ExampleValue" /> 
    </appSettings> 

    <system.data> 
    <DbProviderFactories> 
     <clear /> 
     <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description=".Net Framework Data Provider for Oracle" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
     <add name="EntLibContrib.Data.OdpNet" invariant="EntLibContrib.Data.OdpNet" description="EntLibContrib Data OdpNet Provider" type="EntLibContrib.Data.OdpNet.OracleDatabase, EntLibContrib.Data.OdpNet, Version=5.0.505.0, Culture=neutral, PublicKeyToken=null" /> 
    </DbProviderFactories> 
    </system.data> 


</configuration> 

sto sviluppando su una macchina di 7 x64 di Windows.

Ho scaricato: ODAC1120320Xcopy_32bit.zip (da oracle.com)

Qual è il:

ODAC 11.2 Release 5 (11.2.0.3.20) Scaricare la versione XCopy [Rilasciato l'11 settembre, 2012]

ho decompressi questo file zip.

Ho cercato e pescato fuori questi file:

oci.dll Oracle.DataAccess.dll orannzsbb11.dll oraociei11.dll OraOps11w.dll

Nota, quando c'erano 2 file della stesso nome, ho preso la versione "odp.net20 \ bin" "bin \ 2.x \" o per il mio bisogno Framework 3.5 (io non sono il 4.0 ancora).

Ho preso questi file, e li ho messi in una sottocartella da dove risiede il mio file .sln.

.\MySolution.sln 
.\MyConsoleApplicationFolder\MyConsoleApp.csproj 
.\ThirdPartyReferences\ 
.\ThirdPartyReferences\Oracle\ 

metto tutti i file di cui sopra nella cartella

.\ThirdPartyReferences\Oracle\ 

ho usato "Aggiungi riferimento" per aggiungere un riferimento a Oracle.DataAccess.dll al "MyConsoleApp.csproj" progetto csharp. (Questo navigazione destinato a ".. \ ThirdPartyReferences \ Oracle \", naturalmente)

ho usato un "Post Genera evento" per copiare il "extra" (aka, "accessorio)" file

mie linee nel mio post evento accumulo sono:

copy $(ProjectDir)..\ThirdPartyReferences\Oracle\oci.dll $(TargetDir)*.* 
copy $(ProjectDir)..\ThirdPartyReferences\Oracle\orannzsbb11.dll $(TargetDir)*.* 
copy $(ProjectDir)..\ThirdPartyReferences\Oracle\oraociei11.dll $(TargetDir)*.* 
copy $(ProjectDir)..\ThirdPartyReferences\Oracle\OraOps11w.dll $(TargetDir)*.* 

nota, il mio post evento accumulo sostituisce il "Copia se più recente" dalle istruzioni URL sopra.

Quando ho eseguito il mio progetto ........ Ho un paio di errori di dll mancante.

Nota: Nell'assembly che ha le chiamate agli oggetti EnterpriseLibrary.Data ... verrà visualizzato il messaggio "Impossibile trovare lo spazio dei nomi Microsoft.Practices.SomethingSomething. Basta continuare ad aggiungere riferimenti a queste dll (che il precedente pacchetto.config verrà interrotto) finché gli errori non scompariranno.

Come qui è una specifica:

"Could not load file or assembly 'Microsoft.Practices.ServiceLocation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified." 

Così (dopo l'esecuzione Nuget naturalmente, per scaricare tutti i file) sono andato e ha aggiunto un riferimento a:

\ packages \ CommonServiceLocator. 1.0 \ lib \ NET35 \ Microsoft.Practices.ServiceLocation.dll

Questo ha chiarito i problemi.

E il mio codice csharp: (nota "select *" è per scopi dimostrativi solo)

/* 
    using System; 
    using System.Data; 
    using System.Data.Common; 
    using Microsoft.Practices.EnterpriseLibrary.Data; 
*/ 
public IDataReader EmployeesGetAll() 
{ 

    IDataReader returnReader = null; 

    try 
    { 

     Database db = DatabaseFactory.CreateDatabase(); 
     DbCommand dbc = db.GetSqlStringCommand("SELECT * FROM (SELECT * FROM TEMPLOYEE) WHERE ROWNUM <= 25"); 
     returnReader = db.ExecuteReader(dbc); 
     return returnReader; 

    } 

    finally 
    { 
    } 

} 

e ha funzionato.

Grazie:

https://jeremybranham.wordpress.com/2011/04/25/oracle-instant-client-with-odp-net/#comment-181

Penso che questo rende ODP.NET una distribuzione "xcopy".

Ho ancora bisogno di testare su una macchina pulita per essere sicuro.

Ma la sua alla fine della giornata ..............

================

aggiuntive Informazioni:

Tutto quanto sopra è corretto. Tuttavia, ho colpito un avvertimento. Stavo usando una "Applicazione Console" per testare il mio codice.

Quando si aggiunge una nuova applicazione console a Visual Studio, DEFAULT a x86.

come si vede qui:

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os-aspx

EDIT: (link Aggiornato)

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os

Così, quando ho messo tutta la configurazione e il codice e roba in un vero e proprio progetto (che era impostato su "Qualsiasi CPU" su una macchina x64 bit) ... tutto ciò che avevo fatto smise di funzionare. : <

Dopo tweaking un po '........ Ho trovato questo file sul oracle.com ODAC1120320Xcopy_x64.zip Ho poi ripetuto tutto quello che ho fatto in precedenza, ma la ricerca dei file decompressi di questo file zip x64 .

Tutto funziona.

Ma quella cosa "x86" predefinita con un'applicazione Console mi ha lanciato per un ciclo.

+0

1. Ho messo i miei file dalla mia directory \ bin \ Debug \ su una macchina semi-pulita e l'applicazione della mia console ha funzionato. Questa è la buona notizia. – granadaCoder

+0

2. Il guastafeste con questa soluzione. oraociei11.dll è 127 MB! Youch! – granadaCoder

+0

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os-aspx non trovato – Kiquenet

0

Stavo ricevendo lo stesso errore (provider di dati non trovato) durante la distribuzione di ODP.NET tramite Instant Client. L'unica cosa che dovevo fare era aggiungere il seguente al mio file exe.config (all'interno del tag)

<system.data> 
<DbProviderFactories> 
<add name="Oracle Data Provider for .NET" 
invariant="Oracle.DataAccess.Client" 
description="Oracle Data Provider for .NET" 
type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
</DbProviderFactories> 
</system.data> 
Problemi correlati