Quando si deriva da DbContext e si utilizza il costruttore senza parametri, verrà caricata una stringa di connessione da web.config. Hai anche la possibilità di specificare esplicitamente connectionString usando uno degli altri costruttori di DbContext.
La mia situazione particolare impone che la stringa di connessione NON possa essere specificata nel web.config, poiché la posizione del server / nome utente e password sono determinati in fase di esecuzione. Difficoltà facile, giusto? Basta usare il costruttore sopra menzionato per specificare la stringa di connessione? Sbagliato.
Il problema è che quando si specifica la stringa di connessione utilizzando detto costruttore, si tenta ancora di utilizzare il provider predefinito, quindi se si utilizza uno o più provider non standard, come sono, non funzionerà.
Sono sicuro di poter modificare il provider predefinito in web.config, ma voglio utilizzare più provider, quindi non lo farò.
L'unico modo possibile intorno a ciò che posso vedere è utilizzare ObjectContext al posto di DbContext, che sembra consentire di specificare il provider insieme alla stringa di connessione al database.
c'è un altro modo per farlo? La mia soluzione è abbastanza ragionevole?
Credo di poter anche creare un DbContext da un'istanza di ObjectContext.
Crea manualmente il tuo DbConnection
e DbContext
costruttore DbContext
come segue:
var conn = DbProviderFactories.GetFactory("MY_CONN_PROVIDER").CreateConnection();
conn.ConnectionString = "MY_CONN_STR";
new DbContext(conn, true);
Si noti che il secondo parametro bool contextOwnsConnection
è true
. Dal momento che non si riutilizza la connessione altrove, consente al contesto di gestire la connessione e Dispose()
quando necessario.
È possibile accedere a ObjectContext tramite IObjectContextAdapter:
((IObjectContextAdapter)context).ObjectContext
DbContext ("contesto" sopra) include ancora ObjectContext, quindi non preoccuparti di avere una nuova istanza.
È possibile creare un'istanza di DbContext utilizzando questo sovraccarico
public DbContext(ObjectContext objectContext, bool dbContextOwnsObjectContext) {}
per esempio:
public class YourDbContext : DbContext
{
public YourDbContext() : this(new YourObjectEntities(), dbContextOwnsObjectContext: true)
{}
}
Quindi puoi impostare la stringa di connessione all'interno di 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;
}
}
Come specifichi il fornitore c'è il tuo esercizio.