So entfernen Sie einen ConnectionString mithilfe von Konfigurationstransformationen

76

Ich habe eine Web.config mit mehreren ConnectionStrings

<connectionStrings>
    <add name="connStr1" connectionString="...
    <add name="ConnStr2" connectionString="...
    <add name="connStr3" connectionString="...

Gibt es eine Möglichkeit, mithilfe von Konfigurationstransformationen einen bestimmten Verbindungsstring zu entfernen? Etwas wie:

<connectionStrings>
    <xdt:Remove connStr2?

Offensichtlich nicht annähernd die richtige Syntax, aber Sie bekommen meine Drift ...

Didaxis
quelle

Antworten:

81

Aus der MSDN-Dokumentation zu diesem Thema:

<configuration xmlns:xdt="...">
  <connectionStrings>
    <add xdt:Transform="Remove" />
  </connectionStrings>
</configuration>

Das Transform="Remove"ist die Magie, die Sie suchen. Es gibt auch eine, Transform="RemoveAll"die Sie möglicherweise in Verbindung mit bestimmten Adds verwenden können.

BEARBEITEN

Beim zweiten Gedanken können Sie das LocatorAttribut möglicherweise auch mit dem Removeoben definierten kombinieren, um zu begrenzen, welche Elemente Sie tatsächlich löschen möchten.

Definitiver:

<configuration xmlns:xdt="...">
  <connectionStrings>
    <add xdt:Transform="Remove" xdt:Locator="XPath(configuration/connectionStrings[@name='ConnStr2'])" />
  </connectionStrings>
</configuration>

Oder ähnliches sollte funktionieren.

M.Babcock
quelle
17
Der XPath funktioniert nicht. Die korrekte Syntax ist die von @ hyke20 unten erwähnte. Um die Transformation online zu testen, können Sie verwenden: webconfigtransformationtester.apphb.com
Leniel Maccaferri
Warum sollten Sie den tatsächlichen Namespace im obigen Beispiel entfernen? Es ist: xmlns: xdt = " schemas.microsoft.com/XML-Document-Transform ". Vollständig: [<configuration xmlns: xdt = " schemas.microsoft.com/XML-Document-Transform">]
Nicholas Petersen
@AlexanderRyanBaggett Dies schränkt die Umgebungsportabilität des Codes ein, weshalb zunächst Konfigurationstransformationen verwendet werden. Es mag einen Weg geben, aber ich würde vorschlagen, eine neue Frage zu stellen.
M.Babcock
115

Dadurch wird eine bestimmte Verbindungszeichenfolge basierend auf ihrem Namen entfernt.

<configuration>
  <connectionStrings> 
    <add name="ConnStr2" xdt:Transform="Remove" xdt:Locator="Match(name)" connectionString=" " /> 
  </connectionStrings> 
</configuration>

Beachten Sie, dass der connectionStringWert keine leere Zeichenfolge ist, sondern ein Leerzeichen. Jeder nicht leere Wert würde ausreichen.

hyke20
quelle
2
Das Argument 'DefaultConnection-Web.config Connection String' darf nicht null oder leer sein. Erhalte ich, wenn ich Ihren Code in meine web.release.config einfüge. Irgendwelche Ideen? Vielen Dank
Leigh
8
Warum ist das connectionStringAttribut überhaupt erforderlich? Sollte es nicht xdt:Transform="Remove"möglich sein, den Knoten nur anhand seines Namens zu entfernen?
Dmytro Shevchenko
@DmytroShevchenko & Leigh - Ich erhalte diesen Fehler nicht, wenn ich das Beispiel von hyke20 verwende, aber wenn ich die Eigenschaft 'connectionString' weglasse, wird eine Warnung angezeigt, dass sie fehlt.
Robotnik
Möglicherweise wird eine Warnung angezeigt, wenn das Attribut nicht vorhanden ist. Die Umwandlung sollte jedoch weiterhin korrekt angewendet werden. Ich persönlich habe connectionString="any"mir immer klar gemacht, dass es der Transformation egal ist, welchen Wert die Verbindungszeichenfolge hat.
Josh Gust