2011-10-25 7 views
6

ho la seguente stringa di connessione:Come impostare manualmente una stringa di connessione Oracle in una DbContext

<add name="DataContext" connectionString="DATA SOURCE=Server; 
PASSWORD=123;USER ID=SYSTEM" providerName="Oracle.DataAccess.Client"/> 

La mia logica di business determino ho bisogno di leggere manualmente la stringa di connessione del database:

class MyDbContext: DbContext 
{ 
    public MyDbContext() : 
    base(ConfigurationManager.ConnectionStrings["DataContext"].ConnectionString){} 
    ... 
} 

Funziona correttamente con Sql Server ma quando si passa a una stringa di Oracle Connection non funziona. Succede perché DbContext tenta di utilizzare Oracle ConnectionString per connettersi su un database SQL Server perché non riceve il providerName.

Qualcuno sa come risolvere questo problema?

+0

prova ad aggiungere "provider = System.Data.OracleClient" nella tua connessioneString –

+0

@MaxZerbini che ho provato, non ha funzionato. –

risposta

6

Per creare un DbContext utilizzando Oracle senza l'uso WebConfig, la vostra eredità di DbContext deve iniettare una connessione Oracle al costruttore di base:

class MyDbContext: DbContext 
{ 
    public MyDbContext() : base(new OracleConnection("DATA SOURCE=Server; PASSWORD=123;USER ID=SYSTEM"){} 
    ... 
} 
+0

è questa connessione mnecrando ??? – Seabizkit

3

appena trovato la soluzione dopo aver lottato con questo per tutto il pomeriggio. Sembra che la funzione di costruzione o DbContext utilizzi la stringa di connessione o il nome della stringa di connessione, che non è la stessa, se si passa una stringa di connessione verrà automaticamente impostato su SqlClient, che è l'unica cosa raggruppata per impostazione predefinita in .NET

Ora , se tu, invece di usare l'intera stringa di connessione, passi solo il nome della stringa di connessione, allora analizzerà internamente anche il parametro "providerName" che ha il nome assembly per il provider DB Oracle.DataAccess.Client, per esempio.

Così, invece di passare la stringa di connessione al costruttore DbContext solo passare il nome della stringa di connessione, in questo modo:

file .config:

<connectionStrings> 
    <add name="SQLServer" connectionString="Server=localhost; Database=MyDb; User ID=MyUser;Password=MyPwd;Pooling=false" providerName="System.Data.SqlClient" /> 
    <add name="Oracle" connectionString="Data Source=localhost:1521/XE;Persist Security Info=True;User ID=MyUser;Password=MyPwd;" providerName="Oracle.ManagedDataAccess.Client"/> 
</connectionStrings> 
<appSettings> 
    <add key="DefaultConnection" value="Oracle" /> 
</appSettings> 

E nel tuo DbContext:

public MyDbContext() 
    : base("DefaultConnection") 
{ 

} 

In questo modo è sufficiente impostare una chiave di configurazione con la n ame della stringa di connessione che vuoi collegare al contesto e usarla nel costruttore. Se lo fai in questo modo, EF analizzerà automaticamente l'intero tag della stringa di connessione e non solo il valore dell'attributo connectionString, quindi, carica il provider corretto.

Si noti che sto utilizzando Oracle.ManagedDataAccess.Client che è più recente e solo incluso in ODAC/ODP.NET v12 e versioni successive. Se si utilizza ODAC 11, è necessario utilizzare Oracle.DataAccess.Client in providerName.

Problemi correlati