2011-10-25 8 views
6

tengo la siguiente cadena de conexión:Cómo establecer manualmente una cadena de conexión de Oracle en un DbContext

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

Mi lógica de negocio determino que necesito para leer manualmente la cadena de conexión de la base de datos:

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

Funciona correctamente con el servidor Sql, pero cuando cambio a una cadena de conexión Oracle no funciona. Sucede porque DbContext intenta usar Oracle ConnectionString para conectarse en una Base de datos de servidor Sql porque no recibió el providerName.

Alguien sabe cómo solucionar este problema?

+0

intenta agregar "Provider = System.Data.OracleClient" en su connectionString –

+0

@MaxZerbini Yo probé eso, no funcionó. –

Respuesta

6

Para crear un DbContext utilizando Oracle sin el uso de WebConfig, su herencia de DbContext debe inyectar una conexión a Oracle constructor base:

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

es esto mssing connnectionString ??? – Seabizkit

3

acaba de encontrar la solución después de luchar con esta toda la tarde. Parece que el constructor o DbContext utilizará la cadena de conexión o el nombre de la cadena de conexión, que no es lo mismo, si pasa una cadena de conexión, se establecerá de manera predeterminada en SqlClient, que es la única agrupada por defecto en .NET

Ahora , si, en lugar de utilizar toda la cadena de conexión, pase sólo el nombre de cadena de conexión, entonces internamente analizará también el parámetro "providerName", que tiene el nombre de ensamblado para el proveedor DB Oracle.DataAccess.Client por ejemplo.

Así que en lugar de pasar la cadena de conexión al constructor DbContext acaba de pasar el nombre de cadena de conexión, como esto:

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

Y en su DbContext:

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

} 

De esta manera, simplemente configura una clave de configuración con la n de la cadena de conexión a la que desea enganchar el contexto y usarlo en el constructor. Si lo hace de esta forma, EF analizará automáticamente toda la etiqueta de cadena de conexión y no solo el valor del atributo connectionString, por lo tanto, cargará el proveedor correcto.

hacer la nota que estoy usando Oracle.ManagedDataAccess.Client que es más nueva y única incluida en ODAC/v12 ODP.NET y superiores. Si usa ODAC 11, debe usar Oracle.DataAccess.Client en providerName en su lugar.

Cuestiones relacionadas