2010-06-17 2 views
10

Я хотел бы использовать новую функцию преобразования VS2010 web.config, чтобы изменить строку подключения в конфигурации nhibernate в моем файле web.config. Соответствующий фрагмент кода что-то вроде этого:Как применить VS2010 преобразование 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-конфигурации.

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

ответ

7

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

Вам нужно использовать 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> 
0

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

<?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> 
+0

Я уже пробовал это, но шаг преобразование не может даже найти «зимуют-конфигурацию» узел ... очень вероятно, из-за его Xmlns атрибут , – gschuager

+0

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

15

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

<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 и правильно назвал все узлы)

+0

Мне также нужно добавить совпадение Локатора, чтобы заставить мое работать: Источник данных = Production.db

+1

Я создал инструмент для тестирования преобразования конфигурации, возможно, это может быть помощь: http://webconfigtransformationtester.apphb.com/ – friism

+0

Он работает для меня, но заменяемый элемент имеет «xmlns: hib = "..." 'injected :( –

1

Если все, что вы пытаетесь сделать, это преобразовать e, не используйте механизм преобразования. Вместо этого, в вашем 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>