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.
intenta agregar "Provider = System.Data.OracleClient" en su connectionString –
@MaxZerbini Yo probé eso, no funcionó. –