2017-12-29 11 views
1

Ich habe eine WPF-Anwendung. Es hat viele Blöcke, die auf die Datenbank zugreifen. Die Verbindungszeichenfolge wird durch eine Einstellung in meiner Datei App.config festgelegt.Schaltbare Verbindungszeichenfolgen über Code zur Laufzeit

Aber jetzt brauche ich die Möglichkeit, zur Laufzeit zwischen verschiedenen Datenbanken wechseln. Ich habe den Code aktualisiert, um eine Liste von Datenbanken zusammen mit einer Verbindungszeichenfolge zu verwalten.

Meine Frage ist, gibt es eine Möglichkeit, den vorhandenen Code mit der Verbindungszeichenfolge, die von meinem Code angezeigt wird, ohne den vorhandenen Code ändern zu müssen? Beispielsweise kann ich möglicherweise eine statische Verbindungszeichenfolgeneigenschaft in meiner Entitätsklasse erstellen und diese Klasse dann so ändern, dass sie die Eigenschaft bei jeder Verbindung mit der Datenbank verwendet.

Hat jemand das getan? Irgendwelche Tipps, um dies auf schmerzlose Weise zu tun?

+1

Mit Schalter meinen Sie nur einmal beim Start oder während der Lebensdauer der Anwendung? – Evk

+0

@Evk: Mit * Laufzeit *, ich meine, während die Anwendung läuft. Es kann beliebig oft während einer Instanz der Anwendung passieren. –

+0

Und alle Instanzen von Kontext, die die gleiche Verbindungszeichenfolge verwenden? – Evk

Antwort

0

Also die beste Idee, die ich kam, war eine statische ConnectionString-Eigenschaft zu meiner Entitäten-Klasse hinzuzufügen. Ändern Sie dann den Konstruktor, um diese Eigenschaft an die Basisklasse zu übergeben.

Ein Problem ist, dass jede Änderung an der Entitätsklasse von den T4-Skripten beim Aktualisieren des Modells überschrieben würde. Sie könnten eine partielle Klasse erstellen und Ihren eigenen Konstruktor definieren. Wenn dieser Konstruktor jedoch keine Argumente hat, wird ein Konflikt mit dem vorhandenen Konstruktor verursacht.

Meine Lösung dafür war, das vorhandene T4-Skript direkt zu bearbeiten, wie unten gezeigt.

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext 
{ 
    // Original code 
    //public <#=code.Escape(container)#>() 
    // : base("name=<#=container.Name#>") 
    //{ 

    // Modified code 
    public static string ConnectionString { get; set; } 

    public <#=code.Escape(container)#>() 
     : base(ConnectionString) 
    { 

    // End of modified code 

<# 
if (!loader.IsLazyLoadingEnabled(container)) 
{ 
#> 
     this.Configuration.LazyLoadingEnabled = false; 
<# 
} 

Wenn Sie das T4-Skript speichern, wird der Code sofort neu generiert.

+0

Wie ändert das T4-Skript praktisch die Verbindungszeichenfolge zur Laufzeit? Wird es von einem anderen Prozess oder Dienst erzeugt? – ryanwebjackson

+0

@ryanwebjackson: Der Standardkonstruktor übergibt eine Zeichenfolge, die angibt, dass die Verbindungszeichenfolge aus der Konfigurationsdatei gelesen werden soll. Meine Änderung bewirkt, dass die statische Eigenschaft "ConnectionString" übergeben wird. Der ganze Punkt meiner Frage war, dass ich diese Verbindungszeichenfolge aus Code ändern konnte, und jetzt kann ich den Wert dieser Eigenschaft festlegen. Wenn ich dann eine Instanz von DbContext erstelle, wird dieser Wert verwendet. –

+0

Oh, ich sehe - das war der existierende Code, den du modifiziert hast, um deinen Bedürfnissen zu entsprechen. – ryanwebjackson