Как удалить ConnectionString с помощью преобразований конфигурации

У меня есть Web.config с несколькими ConnectionStrings

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

Есть ли способ с помощью преобразований конфигурации удалить определенную строку подключения? Что-то типа:

<connectionStrings>
    <xdt:Remove connStr2?

Очевидно, что это не совсем правильный синтаксис, но вы поняли мой дрейф...


person Didaxis    schedule 19.01.2012    source источник


Ответы (2)


Из документации MSDN по этому вопросу:

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

Transform="Remove" — это магия, которую вы ищете. Существует также Transform="RemoveAll", который вы можете использовать в сочетании с определенными надстройками.

ИЗМЕНИТЬ

Если подумать, вы также можете комбинировать атрибут Locator с атрибутом Remove, определенным выше. чтобы ограничить, какие элементы вы действительно хотите удалить.

Более определенно:

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

Или подобное должно работать.

person M.Babcock    schedule 19.01.2012
comment
XPath не будет работать. Правильный синтаксис — это тот, который упоминается @hyke20 ниже. Чтобы протестировать преобразование онлайн, вы можете использовать: webconfigtransformationtester.apphb.com - person Leniel Maccaferri; 07.02.2012
comment
Почему вы удалили фактическое пространство имен в приведенном выше примере? Это: xmlns:xdt=schemas.microsoft.com/XML-Document-Transform. . Полностью: [‹configuration xmlns:xdt=schemas.microsoft.com/XML-Document-Transform ›] - person Nicholas Petersen; 11.08.2016
comment
@AlexanderRyanBaggett Это ограничивает переносимость кода в среду, поэтому для начала используются преобразования конфигурации. Возможно, есть способ сделать это, но я бы предложил задать новый вопрос. - person M.Babcock; 04.05.2017

Это удалит определенную строку подключения на основе ее имени.

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

Обратите внимание, что значение connectionString — это не пустая строка, а пробел. Подойдет любое непустое значение.

person hyke20    schedule 30.01.2012
comment
Аргумент «Строка подключения DefaultConnection-Web.config» не может быть нулевым или пустым. Это то, что я получаю, когда помещаю ваш код в свой файл web.release.config. Есть идеи? Спасибо - person Leigh; 09.04.2013
comment
Зачем вообще нужен атрибут connectionString? Разве xdt:Transform="Remove" не может удалить узел, основываясь только на его имени? - person Dmytro Shevchenko; 23.11.2016
comment
@DmytroShevchenko & Leigh - я не получаю эту ошибку, когда использую пример hyke20, но если я не использую свойство «connectionString», я получаю предупреждение о том, что оно отсутствует. - person Robotnik; 06.02.2017
comment
Вы можете получить предупреждение, если атрибут отсутствует, но преобразование все равно должно применяться правильно. Я лично использую connectionString="any", чтобы в будущем мне было ясно, что преобразование не заботится о значении строки подключения. - person Josh Gust; 16.08.2019