changer le nom de la base de données dans la chaîne de connexion au moment de l'exécution dans Entity Framework

.net entity-framework runtime

Question

Dans mon projet, je souhaite exécuter des tests unitaires sur la couche DAL utilisant EntityFramework. Je crée à partir de scripts une nouvelle base de données avant chaque exécution de tests (afin de toujours conserver les mêmes données initiales lors des tests). À la fin des tests, cette base de données est supprimée (tout est effectué automatiquement à l'aide des attributs [ClassInitialize ()] et [ClassCleanup ()].

La base de données générée a toujours un nom différent, par exemple TestDB-2009-01-31--12-00-00, afin de ne pas entrer en conflit avec les bases de données de test de mes collègues.

Le problème que je rencontre est que je n'ai pas encore trouvé le moyen de demander à EntityFramework de se connecter à la base de données générée (le nom est généré au moment de l'exécution). Pour le moment, il se connecte à la chaîne de connexion spécifiée dans le fichier app.config, ce qui est normal, bien sûr. Et comme je fais ces tests, je cherche quelque chose qui peut être fait depuis l’extérieur de la DLL DAL (sans rien définir directement dans le contexte EF).

Toute aide est grandement appréciée.

Merci.

Réponse acceptée

Lorsque vous créez le ObjectContext, vous devez utiliser la surcharge de constructeur qui prend un ConnectionString en tant que paramètre.

Vous pouvez créer ce ConnectionString à l'aide d'un EntityConnectionStringBuilder . Plus précisément, en supposant que votre base de données sous-jacente est SQL Server, vous pouvez utiliser SqlConnectionStringBuilder pour générer la valeur de EntityConnectionStringBuilder.ProviderConnectionString.

Voici un code qui construit la chaîne de connexion SQL Server

var scsb = new SqlConnectionStringBuilder();
scsb.DataSource = "localhost";
scsb.InitialCatalog = "MyDB";
scsb.IntegratedSecurity = true;

Et voici un code qui construit Entity ConnectionString:

var builder = new EntityConnectionStringBuilder();
builder.Metadata = "res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl";
builder.Provider = "System.Data.SqlClient";
builder.ProviderConnectionString = scsb.ConnectionString;


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow