10

新しいVS2010web.config変換機能を使用して、web.configファイルのnhibernate構成内の接続文字列を変更したいと思います。関連するスニペットは次のようなものです。

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

問題は、nhibernate-configuration要素のxmlns属性にあるようです。

展開中に(テスト接続文字列)を(本番接続文字列)に置き換える正しい変換は何でしょうか?

4

4 に答える 4

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ファイルには、ありがたいことに名前空間プレフィックスがありませんでした(つまり、元のweb.configファイルと同じ場所にnhibernate名前空間宣言が残り、すべてのノードに正しく名前が付けられました)

于 2010-09-27T06:28:30.110 に答える
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>
于 2010-09-21T23:42:22.950 に答える
1

接続文字列を変換するだけの場合は、変換メカニズムを使用しないでください。代わりに、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>
于 2012-08-22T14:22:18.487 に答える
0

session-factoryには子要素のコレクションが含まれているため、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>
于 2010-06-25T15:29:21.970 に答える