How to remove a ConnectionString using Config Transformations
Asked Answered
C

2

81

I have a Web.config with several ConnectionStrings

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

Is there a way using config transformations to remove a specific connectionstring? Something Like:

<connectionStrings>
    <xdt:Remove connStr2?

Obviously no where near the correct syntax, but you get my drift...

Craggy answered 19/1, 2012 at 2:50 Comment(0)
F
85

From the MSDN documentation on the subject:

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

The Transform="Remove" is the magic you're looking for. There is also a Transform="RemoveAll" which you might be able to use in conjunction with a specific add(s).

EDIT

On second thought you may also be able to combine the Locator attribute with the Remove defined above to limit which elements you actually want to delete.

More definitively:

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

Or similar should work.

Forbiddance answered 19/1, 2012 at 3:14 Comment(3)
The XPath won't work. The correct syntax is the one mentioned by @Phira bellow. To test the transformation online you can use: webconfigtransformationtester.apphb.comParasiticide
Why would you remove the actual namespace in the sample above? It is: xmlns:xdt="schemas.microsoft.com/XML-Document-Transform". Fully: [<configuration xmlns:xdt="schemas.microsoft.com/XML-Document-Transform">]Tempestuous
@AlexanderRyanBaggett Doing so limits the environment portability of the code which is the reason config transforms are used to begin with. There may be a way to do it but I'd suggest asking a new question.Forbiddance
P
124

This will remove a specific connection string based on its name.

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

Note that the connectionString value is not empty string, but is instead a space. Any non-empty value would do.

Phira answered 30/1, 2012 at 11:45 Comment(4)
The 'DefaultConnection-Web.config Connection String' argument cannot be null or empty. Is what I get when I place your code inside my web.release.config. Any ideas? ThanksHexagram
Why is the connectionString attribute required, at all? Shouldn't xdt:Transform="Remove" be able to remove the node based on its name only?Buckeen
@DmytroShevchenko & Leigh - I don't get that error when I use hyke20's example, but if I leave off the 'connectionString' property I get a warning that it's missing.Grenadier
You may get a warning if the attribute is not present, but the transformation should still apply correctly. I personally use connectionString="any" to be clear to future me that the transform doesn't care what the value of the connection string is.Ceiba
F
85

From the MSDN documentation on the subject:

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

The Transform="Remove" is the magic you're looking for. There is also a Transform="RemoveAll" which you might be able to use in conjunction with a specific add(s).

EDIT

On second thought you may also be able to combine the Locator attribute with the Remove defined above to limit which elements you actually want to delete.

More definitively:

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

Or similar should work.

Forbiddance answered 19/1, 2012 at 3:14 Comment(3)
The XPath won't work. The correct syntax is the one mentioned by @Phira bellow. To test the transformation online you can use: webconfigtransformationtester.apphb.comParasiticide
Why would you remove the actual namespace in the sample above? It is: xmlns:xdt="schemas.microsoft.com/XML-Document-Transform". Fully: [<configuration xmlns:xdt="schemas.microsoft.com/XML-Document-Transform">]Tempestuous
@AlexanderRyanBaggett Doing so limits the environment portability of the code which is the reason config transforms are used to begin with. There may be a way to do it but I'd suggest asking a new question.Forbiddance

© 2022 - 2024 — McMap. All rights reserved.