使用Castle AR同时访问两个数据库方法总结

    最近的项目使用castle 的AR作为ORM。在实际使用中,遇到如何使AR可以同时使用两个数据库的问题。通过查看AR的文档,知道通过配置文件配置不同的ActiveRecordBase可以完成对两个数据库同时访问的要求,一开始,我认为文档的解决方法出现一些错误,使访问数据出错。后来通过实验,事实证明文档是正确的。
    根据文档,如果要AR同时访问两个数据库,可以通过继承ActiveRecordBase来完成,貌似如下的形式:
   [ActiveRecord]
   public abstract class AClass<T> : ActiveRecordBase<T>
   {
   }
   [ActiveRecord]
   public abstract class BClass<T> : ActiveRecordBase<T>
  {
  }

配置文件中,应该进行如下设置:
<activerecord isDebug="true">
  <config>
    <add key="connection.driver_class" value="NHibernate.Driver.OracleClientDriver" />
    <add key="dialect" value="NHibernate.Dialect.Oracle9iDialect" />
    <add key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
    <add key="connection.connection_string" value="Data Source=test;User ID=name;Password=password;" />
    <add key="show_sql" value="true" />
    <add key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" />
  </config>
  <config type="BClass`1, testNameSpace">
    <add key="connection.driver_class" value="NHibernate.Driver.OracleClientDriver" />
    <add key="dialect" value="NHibernate.Dialect.Oracle9iDialect" />
    <add key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
    <add key="connection.connection_string" value="Data Source=test2;User ID=name2;Password=password2;" />
    <add key="show_sql" value="true" />
    <add key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" />
  </config>

</activerecord>

注意,BClass是泛型类型,在配置文件中,类名要以`1结尾。“testNameSpace”告诉ActiverRecord去哪个装配集中找BClass<T>类。第一个config文件中,不要指定type,这是默认的配置文件。


最后,以下是我的初始化代码:
var source = new XmlConfigurationSource(ConfigPath + ActiveRecordConfigFile);
ActiveRecordStarter.Initialize(source, typeof(BClass), typeof(AClass));

posted on 2010-03-10 13:19  oliverPP  阅读(446)  评论(0编辑  收藏  举报

导航