我想使用新的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属性中。
在部署期间,用(生产连接字符串)替换(测试连接字符串)的正确转换应该是什么?
答案 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文件并正确命名所有节点)
答案 1 :(得分: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>
答案 2 :(得分: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>
答案 3 :(得分:0)
由于session-factory包含子元素的集合,您需要使用匹配定位器告诉它要替换哪个子元素。
<?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>