Как применить преобразование VS2010 web.config к элементу с атрибутом пространства имен? - PullRequest
10 голосов
/ 17 июня 2010

Я бы хотел использовать новую функцию преобразования VS2010 web.config для изменения строки подключения в конфигурации nhibernate в моем файле web.config. Соответствующий фрагмент выглядит примерно так:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
  </configSections>

  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="connection.driver_class">NHibernate.Driver.OracleDataClientDriver</property>
      <property name="connection.connection_string">(test connection string)</property>
      <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
...

Я безуспешно пробовал следующее преобразование:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
        <session-factory>
            <property name="connection.connection_string" xdt:Transform="Replace">(production connection string)</property>
        </session-factory>
    </hibernate-configuration>
</configuration>

Кажется, проблема в атрибуте xmlns элемента nhibernate-configuration.

Каким должно быть правильное преобразование для замены (строка тестового соединения) на (строка производственного соединения) во время развертывания?

Ответы [ 4 ]

15 голосов
/ 27 сентября 2010

Недавно я столкнулся с той же проблемой - она ​​была решена путем размещения явных префиксов пространства имен в файле преобразования

<configuration
               xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"
               xmlns:hib="urn:nhibernate-configuration-2.2"
              >
    <hib:hibernate-configuration>
        <hib:session-factory>
            <hib:property name="connection.connection_string" xdt:Transform="Replace">(production connection string)</hib:property>
        </hib:session-factory>
    </hib:hibernate-configuration>
</configuration>

Полученный преобразованный файл web.config, к счастью, был свободен от префиксов пространства имен (то есть он оставилОбъявление пространства имен nhibernate в том же месте, что и в исходном файле web.config, и правильное именование всех узлов)

7 голосов
/ 22 сентября 2010

Ответ может быть немного запоздалым, но, поскольку мне это тоже нужно, я решил опубликовать ответ, который сработает для меня, если кто-нибудь еще наткнется на этот вопрос.

Вам нужно использовать xdt: Locator в сочетании с выражением xpath, чтобы получить правильный узел. Так что-то вроде этого должно работать.

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
   <session-factory>
      <property name="connection.connection_string" xdt:Locator="XPath(//*[local-name()='hibernate-configuration']//*[local-name()='property'][@name='connection.connection_string'])" xdt:Transform="Replace">(production connection string)</property>
   </session-factory>
</hibernate-configuration>

Возможно, лучше выражение xpath, но это то, что у меня сработало.

Единственная проблема, которая не так уж и сложна, заключается в том, что на замененном узле будет повторно объявлено пространство имен на узле. Таким образом, замененный узел на самом деле будет выглядеть так в конечном выводе.

<property name="connection.connection_string" xmlns="urn:nhibernate-configuration-2.2">(production connection string)</property>
1 голос
/ 22 августа 2012

Если все, что вы пытаетесь сделать, это преобразовать строку подключения, не используйте механизм преобразования. Вместо этого в вашем файле web.config или app.config укажите это свойство

connection.connection_string_name

вместо этого:

connection.connection_string

Это позволяет вам ссылаться на строку подключения, определенную в разделе ConnectionStrings, которая преобразуется обычным способом.

например, в web.config, используйте этот код:

<connectionStrings>
  <add name="DefaultConnection" connectionString="server=MYSERVER; Integrated Security=SSPI; database=MYDATABASE"/>
</connectionStrings>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string_name">DefaultConnection</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
    <property name="current_session_context_class">web</property>
    <property name="show_sql">true</property>
  </session-factory>
</hibernate-configuration>
0 голосов
/ 25 июня 2010

Поскольку фабрика сеанса содержит коллекцию дочерних элементов, вы должны указать ей, какой дочерний элемент заменить, используя локатор Match.

<?xml version="1.0"?>
    <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
        <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
            <session-factory>
                <property name="connection.connection_string" xdt:Transform="Replace" xdt:Locator="Match(name)>(production connection string)</property>
            </session-factory>
        </hibernate-configuration>
    </configuration>
...