Cuando derive de DbContext y use el constructor sin parámetros, cargará una cadena de conexión desde web.config. También tiene la opción de especificar explícitamente la cadena de conexión usando uno de los otros constructores de DbContext.
Mi situación particular determina que la cadena de conexión NO PUEDE especificarse en web.config, ya que la ubicación del servidor / nombre de usuario y la contraseña se determinan en el tiempo de ejecución. Fácil de arreglar ¿no? ¿Solo usa el constructor mencionado anteriormente para especificar la cadena de conexión? Incorrecto.
El problema es que cuando especifica la cadena de conexión utilizando dicho constructor, todavía intenta utilizar el proveedor predeterminado, por lo que si está utilizando uno o más proveedores no estándar, como yo, no funcionará.
Estoy seguro de que puedo cambiar el proveedor predeterminado en web.config, pero quiero usar varios proveedores, por lo que no funcionará.
La única forma posible de evitar esto es usar ObjectContext en lugar de DbContext, que parece permitirle especificar el proveedor junto con la cadena de conexión de la base de datos.
¿Hay alguna otra forma de hacerlo? ¿Es mi solución bastante razonable?
Creo que también puedo crear un DbContext desde una instancia de ObjectContext.
Cree su DbConnection
manualmente y páselo al constructor DbContext
siguiente manera:
var conn = DbProviderFactories.GetFactory("MY_CONN_PROVIDER").CreateConnection();
conn.ConnectionString = "MY_CONN_STR";
new DbContext(conn, true);
Note que el segundo parámetro bool contextOwnsConnection
es true
. Debido a que no reutiliza la conexión en otro lugar, permite que el contexto administre la conexión y la Dispose()
cuando sea necesario.
Puede acceder al ObjectContext a través de IObjectContextAdapter:
((IObjectContextAdapter)context).ObjectContext
DbContext ("contexto" más arriba) aún envuelve ObjectContext, así que no se preocupe de tener una nueva instancia.
Puede crear una instancia de DbContext utilizando esta sobrecarga
public DbContext(ObjectContext objectContext, bool dbContextOwnsObjectContext) {}
por ejemplo:
public class YourDbContext : DbContext
{
public YourDbContext() : this(new YourObjectEntities(), dbContextOwnsObjectContext: true)
{}
}
Luego puede configurar su cadena de conexión dentro de YourObjectEntities:
public partial class YourObjectEntities : ObjectContext
{
public const string ConnectionString = "name=YourEntities"; // Get it from somewhere
public YourObjectEntities() : base(ConnectionString, "YourEntities")
{
// Some initialization, e.g. ContextOptions.LazyLoadingEnabled = false;
}
}
Cómo especifique el proveedor allí es su ejercicio.