Ich habe eine Codebasis, die EF Core und Dapper verwendet, um Aktionen für eine Datenbank auszuführen. Ich möchte eine neue Kopie der Site einrichten, um einige Funktionen zu entwickeln, und ich möchte, dass diese Site eine Verbindung zu einer neuen isolierten Kopie der Datenbank ( dbConnectionDEBUG
) herstellt.
Im Moment verwende ich das folgende Setup:
startup.cs
...
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("dbConnectionMain")));
services.Configure<ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));
...
Ich habe eine ConnectionStrings
Klasse, die beim Start über den DI korrekt ausgefüllt wird:
public class ConnectionStrings
{
public string dbConnectionMain { get; set; }
public string dbConnectionDEBUG { get; set; }
public ConnectionStrings()
{
this.dbConnectionMain = "";
this.dbConnectionDEBUG = "";
}
}
Dann habe ich über meine Controller / Dienste Zugriff auf ConnectionStrings
und mache in 99% der Fälle Folgendes, um DB-Aufrufe durchzuführen:
using (var conn = new SqlConnection(_connectionStrings.dbConnectionMain))
{
conn.Open();
...
Dies würde eine Menge Codeänderungen bedeuten, wenn ich auf die 'DEBUG'-Datenbank umsteigen möchte.
Wie kann ich einfach zwischen den Verbindungszeichenfolgen in meinem Code wechseln, je nachdem, an welcher Version des Systems ich arbeite? Wenn ich das irgendwie dynamisch machen könnte, wäre das großartig. Der offensichtliche bestimmende Faktor wäre die URL, mit der die Site arbeitet.
Alternativ ändere ich (als einzelne Änderung) einfach manuell die Verbindungszeichenfolge an der Quelle (z. B. Keystore / Appsettings). Ich bin nicht begeistert davon, da es Raum für menschliches Versagen lässt.
Basierend auf dem, was @Nkosi erwähnt hat, verfolge ich diesen Weg:
dbConnection
Sie eine Verbindungszeichenfolge 'Id' (dh dbConnection
) durchgehend verwenden Ich habe eine andere Frage:
Wenn ich folgendes habe ...
"MYAPPNAME": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:12345/;https://myapptestdomain.com/"
}
und:
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
IHostingEnvironment env = context.HostingEnvironment;
config.AddJsonFile($"appsettings.{env.EnvironmentName.ToLower()}.json", optional: true);
})
.UseStartup<Startup>();
... wird dies automatisch feststellen, dass sich meine Site basierend auf den applicationUrl
Werten im Development
, ODER muss ich ASPNETCORE_ENVIRONMENT
manuell mit einem Wert Development
auf dem Server hinzufügen, auf dem ich die App bereitstelle?
Zusätzlich: Meine App wird in einem Azure App-Dienst ausgeführt.
Um diese Frage abzuschließen (falls jemand dies wissen muss), habe ich das folgende Setup basierend auf den Empfehlungen von @Nkosi.
dbConnection
/ Name dbConnection
die in allen AppSettings verwendet wird (siehe unten). appSettings.json
mit dbConnection
, die die Live-Datenbank betrachtet appSettings.Playground.json
mit dbConnection
, die meine dbConnection
durchsucht playground
ich eine App-Einstellung für ASPNETCORE_ENVIRONMENT mit dem Wert "Spielplatz" hinzugefügt. Program.cs
Datei habe ich: config.AddJsonFile($"appsettings.json", optional: true,reloadOnChange: true);
und
config.AddJsonFile($"appsettings.{env.EnvironmentName.ToLower()}.json", optional: true,reloadOnChange: true);
Zu beachten ist, dass ich auch einen Tresor in Azure initialisiere, in dem alle meine Schlüssel und Geheimnisse für die Azure-basierten Apps gespeichert sind. Lokale User Secrets
verwendet.
ASP.NET Core liest die Umgebungsvariable ASPNETCORE_ENVIRONMENT beim Start der App und speichert den Wert in
IHostingEnvironment.EnvironmentName
.
Da die Umgebung geladen wird, sollte sie über den Builder-Kontext in der Hosting-Umgebung verfügbar sein
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) => {
string environment = context.HostingEnvironment.EnvironmentName; //get current environment
//load config based on environment.
config.AddJsonFile($"appsettings.{environment}.json", optional: true);
//...
})
//...
Ich denke, wenn Sie 2 Verbindungen für Debug und Main hinzufügen, werden Sie einige Schwierigkeiten haben, weil mehr Mitglieder in Ihrem Team arbeiten. Möglicherweise verwenden Sie den Release-Modus fälschlicherweise für die Codeentwicklung.
Sie können diese webconfig-Methode ausprobieren:
öffentliche Klasse ConnectionStrings {public string dbConnection {get; einstellen; }}
public ConnectionStrings()
{
bool Ismain = bool.Parse(System.Configuration.ConfigurationManager.AppSettings["HasLive"]);
if (Ismain)
{
dbConnection = "";// get Main connectionstring
}
else
{
dbConnection = "";// get Debug connectionstring
}
}
}
web.config:
<connectionStrings>
<add name="dbConnectionMain" connectionString="" providerName="System.Data.SqlClient" />
<add name="dbConnectionDEBUG" connectionString="" roviderName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
<add key="HasLive" value="false"/>
</appSettings>
</connectionStrings>