Замкните активную запись нескольких соединений с базами данных (Oracle и SQL) - PullRequest
2 голосов
/ 22 сентября 2010

Сценарий: У меня есть приложение, которое извлекает данные из базы данных SQL, а также из базы данных Oracle.У меня реализован NHibernate для стороны SQL, и у сотрудника уже есть работающая реализация стороны Oracle (один и тот же объект, другой проект).В настоящее время я определяю строку подключения в App.Config и вызываю эту функцию в Program.cs

 var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Foo"].ToString();
 var configuration = InPlaceConfigurationSource.Build(DatabaseType.MsSqlServer2000, connectionString);
 ActiveRecordStarter.Initialize(System.Reflection.Assembly.GetExecutingAssembly(), configuration);

Обратите внимание, что проект находится в C # .Net 3.5

Я читал об использовании DifferentDatabaseScope, нокогда я пытаюсь, чтобы запросы не дали результатов, я не вижу ничего в NHib Profiler.Никаких ошибок не появляется, только 0.

Вопрос: Как реализовать несколько соединений?

1 Ответ

4 голосов
/ 24 сентября 2010

Для будущих пользователей, которые сталкиваются с этой проблемой.
Эта статья помогает http://www.darkside.co.za/archive/2008/01/21/castle-activerecord-connecting-to-multiple-databases.aspx

Чтобы заставить это работать, мне пришлось добавить эти фрагменты кода в мой App.config

<activerecord>

<config>
  <add key="connection.driver_class" 
      value="NHibernate.Driver.OracleClientDriver" />
  <add key="dialect"                 
      value="NHibernate.Dialect.Oracle10gDialect" />
  <add key="connection.provider"            
      value="NHibernate.Connection.DriverConnectionProvider" />
  <add key="connection.connection_string" 
      value="Data Source = 
              (DESCRIPTION = 
                 (ADDRESS = 
                    (PROTOCOL = TCP)
                    (HOST = SERVERNAME)
                    (PORT = 1521)
                 )
                 (ADDRESS = 
                    (PROTOCOL = TCP)
                    (HOST = SERVERNAME)
                    (PORT = 1521)
                 )
                 (LOAD_BALANCE = yes)
                 (CONNECT_DATA =
                    (SERVER = DEDICATED)
                    (SERVICE_NAME = NAME)
                 )
              );User Id = ID; Password = PASS;" />
</config>

А это

    <config type="Sens.SensClass`1, Sens">
      <add key="connection.driver_class" 
         value="NHibernate.Driver.SqlClientDriver" />
      <add key="dialect"                 
         value="NHibernate.Dialect.MsSql2000Dialect" />
      <add key="connection.provider"     
         value="NHibernate.Connection.DriverConnectionProvider" />
      <add key="connection.connection_string" 
         value="Data Source=mntcon016\;Initial Catalog=TEST;Trusted_Connection=True;" />
    </config>
  </activerecord>


  <configSections>
    <section name="activerecord"
                type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord" />
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
  </configSections>
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="proxyfactory.factory_class"> NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle </property>
    </session-factory>
  </hibernate-configuration>

Затем в Program.cs перед Application.Run у меня есть

 ActiveRecordStarter.Initialize(
               ActiveRecordSectionHandler.Instance, types.ToArray());

Где типами является список (функция требует массив) типа []. Этот список должен содержать каждый класс, который будет использоваться с Nhibernate. В моем случае он содержит классы SQL и Oracle. Как и этот класс, который наследуется всеми моими классами SQL

public abstract class TestClass<T> : ActiveRecordBase<T>
{

}

Для генерации своих классов SQL я использовал генератор, и он сделал их сериализуемыми, которые нужно было снять. Также обратите внимание, что у вас не может быть классов с одинаковым именем, иначе вы получите ошибку.

...