2010-06-17 14 views
10

Ich mag die neue VS2010 web.config Transformation-Funktion verwenden, um die Verbindungszeichenfolge in der nhibernate Konfiguration in meiner web.config-Datei zu ändern. Der entsprechende Code-Schnipsel ist so etwas wie folgt aus:Wie VS2010 web.config Transformation auf ein Element mit einem Namespace-Attribute anwenden?

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

ich die folgende Transformation ohne Erfolg versucht haben:

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

Das Problem scheint in der xmlns Attribut des nhibernate-Konfigurationselement zu sein.

Was sollte die richtige Transformation zu ersetzen (Test Connection String) mit (Produktionsverbindungszeichenfolge) während des Einsatzes?

Antwort

7

Die Antwort kann ein bisschen spät, aber da ich dies auch nötig, dachte ich, ich hätte gerne eine Antwort hinterlassen, die für mich in dem Fall jemand stolpert über diese Frage gearbeitet.

Sie müssen die xdt verwenden: Locator in Kombination mit einem XPath-Ausdruck, der den richtigen Knoten zu erhalten. Also sollte so etwas funktionieren.

Es mag einen besseren XPath-Ausdruck geben, aber das hat bei mir funktioniert.

Die einzige Frage, die nicht so große Sache ist, die ersetzt Knoten auf dem Knoten einen Namespace neu deklariert. Daher wird der ersetzte Knoten in der endgültigen Ausgabe tatsächlich so aussehen.

<property name="connection.connection_string" xmlns="urn:nhibernate-configuration-2.2">(production connection string)</property> 
0

Seit sitzungs Fabrik verfügt über eine Sammlung von untergeordneten Elemente enthält, müssen Sie es, welches Kind sagen, mit dem Spiel-Locator zu ersetzen.

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

Ich habe bereits versucht, das, aber der Transformationsschritt die „Hibernate-Konfiguration“ Knoten nicht einmal finden kann ... sehr wahrscheinlich aufgrund seiner xmlns Attribut . – gschuager

+0

Ich weiß, dass ich hier nach Strohhalmen griffe, aber das letzte, was ich vor dem Aufgeben versuchen würde, wäre, diesen zusätzlichen Leerraum im Hibernate-Konfigurationselement zu eliminieren, so dass die Konfigurationen genau übereinstimmen. Ich habe meinen obigen Code bearbeitet, um zu reflektieren, worüber ich rede. –

15

Ich traf vor kurzem das gleiche Problem - es indem expliziten Namespacepräfixe in der Transformationsdatei

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

Die resultierende transformierten Datei web.config war glücklicherweise frei von dem Namespacepräfixe gelöst wurde (dh Die nhibernate-Namespace-Deklaration wurde an der gleichen Stelle gelassen wie in der ursprünglichen web.config-Datei und alle Knoten korrekt benannt.

+0

Ich musste auch Locator-Match hinzufügen, um meins zur Arbeit zu bringen: Datenquelle = Production.db

+1

Ich habe ein Tool zum Testen der Konfiguration Umwandlung erstellt, vielleicht kann es eine Hilfe sein: http://webconfigtransformationstester.apphb.com/ – friism

+0

Es funktioniert für mich, aber das ersetzte Element hat die 'xmlns: hib = "..." 'injiziert :( –

1

Wenn Sie nur versuchen, th zu transformieren Die Verbindungszeichenfolge verwenden Sie nicht den Umwandlungsmechanismus. Stattdessen verweisen in Ihrer web.config oder app.config, diese Eigenschaft

connection.connection_string_name 

statt dieses:

connection.connection_string 

Dies Sie die Verbindungszeichenfolge in der Connection Abschnitt definiert verweisen erlaubt, das ist in der üblichen Weise umgewandelt.

zB in web.config, verwenden Sie diesen Code:

<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> 
Verwandte Themen