Lorsque vous dérivez de DbContext et utilisez le constructeur sans paramètre, il charge une chaîne de connexion depuis web.config. Vous avez également la possibilité de spécifier explicitement connectionString en utilisant l’un des autres constructeurs DbContext.
Ma situation particulière implique que la chaîne de connexion NE PEUT PAS être spécifiée dans le fichier web.config, car l'emplacement du serveur / nom d'utilisateur et mot de passe sont déterminés au moment de l'exécution. Solution facile non? Utilisez simplement le constructeur mentionné ci-dessus pour spécifier la chaîne de connexion? Faux.
Le problème est que, lorsque vous spécifiez la chaîne de connexion à l'aide dudit constructeur, le système tente toujours d'utiliser le fournisseur par défaut. Par conséquent, si vous utilisez un ou plusieurs fournisseurs non standard, comme je le suis, cela ne fonctionnera pas.
Je suis sûr que je peux changer le fournisseur par défaut dans le fichier web.config, mais je souhaite utiliser plusieurs fournisseurs afin d'éviter ce problème.
Le seul moyen de contourner ce problème est d'utiliser ObjectContext au lieu de DbContext, ce qui semble vous permettre de spécifier le fournisseur avec la chaîne de connexion à la base de données.
Y a-t-il un autre moyen de le faire? Est-ce que ma solution de contournement est assez raisonnable?
Je crois que je peux aussi créer un DbContext à partir d'une instance d'ObjectContext.
Créez votre DbConnection
manuellement et transmettez-la DbContext
constructeur DbContext
comme suit:
var conn = DbProviderFactories.GetFactory("MY_CONN_PROVIDER").CreateConnection();
conn.ConnectionString = "MY_CONN_STR";
new DbContext(conn, true);
Notez que le second paramètre bool contextOwnsConnection
est true
. Comme vous ne réutilisez pas la connexion ailleurs, cela permet au contexte de gérer la connexion et à Dispose()
si nécessaire
Vous pouvez accéder à ObjectContext via IObjectContextAdapter:
((IObjectContextAdapter)context).ObjectContext
DbContext ("contexte" ci-dessus) enveloppe toujours ObjectContext, alors ne vous inquiétez pas si vous aurez une nouvelle instance.
Vous pouvez instancier DbContext en utilisant cette surcharge
public DbContext(ObjectContext objectContext, bool dbContextOwnsObjectContext) {}
par exemple:
public class YourDbContext : DbContext
{
public YourDbContext() : this(new YourObjectEntities(), dbContextOwnsObjectContext: true)
{}
}
Ensuite, vous pouvez définir votre chaîne de connexion dans 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;
}
}
Comment vous spécifiez le fournisseur il y a votre exercice.