10

我想使用新的 VS2010 web.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 文件幸运的是没有命名空间前缀(即,它将 nhibernate 命名空间声明留在与原始 web.config 文件相同的位置,并正确命名了所有节点)

于 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 回答