ActiveRecord 底層封裝 NHibernate,配置項與 NHibernate 完全一致:
| 屬性鍵 | 說明 | 範例值 |
|---|---|---|
hibernate.connection.driver_class | ADO.NET 驅動類別 | NHibernate.Driver.SqlClientDriver |
hibernate.dialect | SQL 方言(關鍵!決定 SQL 生成語法) | NHibernate.Dialect.MsSql2000Dialect |
hibernate.connection.provider | 連接提供者 | NHibernate.Connection.DriverConnectionProvider |
hibernate.connection.connection_string | 資料庫連接字串 | Data Source=.;Initial Catalog=Test;Integrated Security=SSPI |
hibernate.connection.isolation | 交易隔離級別 | ReadCommitted |
| 資料庫 | Dialect 類別 |
|---|---|
| Microsoft SQL Server 2000/2005/2008 | NHibernate.Dialect.MsSql2000Dialect / MsSql2005Dialect / MsSql2008Dialect |
| Oracle 9i/10g/11g | NHibernate.Dialect.Oracle9Dialect / Oracle10gDialect |
| MySQL 5.x | NHibernate.Dialect.MySQLDialect / MySQL5Dialect |
| PostgreSQL | NHibernate.Dialect.PostgreSQLDialect |
| Firebird | NHibernate.Dialect.FirebirdDialect |
| SQLite | NHibernate.Dialect.SQLiteDialect |
| DB2 | NHibernate.Dialect.DB2Dialect |
| Sybase | NHibernate.Dialect.SybaseDialect |
提示:指定正確 Dialect 可自動啟用該資料庫特有功能(如 Limit/Offset、Sequence、鎖定語法),避免手工配置大量參數。
MyConfig.xml:
<?xml version="1.0" encoding="utf-8"?>
<activerecord>
<config>
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" />
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="hibernate.connection.connection_string" value="Data Source=.;Initial Catalog=ARDemo;Integrated Security=SSPI" />
</config>
</activerecord>
程式碼初始化:
var source = new XmlConfigurationSource("MyConfig.xml");
ActiveRecordStarter.Initialize(source, typeof(Blog), typeof(Post));
建構子多載:支援檔案路徑、Stream、TextReader。建置後事件複製 XML 至輸出目錄:
copy "$(ProjectDir)\*.xml" "$(TargetDir)"
var source = new InPlaceConfigurationSource();
var props = new Hashtable {
["hibernate.connection.driver_class"] = "NHibernate.Driver.SqlClientDriver",
["hibernate.dialect"] = "NHibernate.Dialect.MsSql2000Dialect",
["hibernate.connection.provider"] = "NHibernate.Connection.DriverConnectionProvider",
["hibernate.connection.connection_string"] = "Data Source=.;Initial Catalog=ARDemo;UID=sa;Password=sa"
};
source.Add(typeof(ActiveRecordBase), props);
ActiveRecordStarter.Initialize(source, typeof(Blog));
適用於連接字串需運行時動態決定(如多租戶切換資料庫)的場景。
配置區段註冊:
<configSections>
<section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord" />
</configSections>
配置內容:
<activerecord>
<config>
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" />
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="hibernate.connection.connection_string" value="Data Source=.;Initial Catalog=ARDemo;Integrated Security=SSPI" />
</config>
</activerecord>
初始化代碼:
// .NET Framework 2.0+
var source = (IConfigurationSource)ConfigurationManager.GetSection("activerecord");
ActiveRecordStarter.Initialize(source, typeof(Blog), typeof(Post));
在 <activerecord isWeb="true"> 啟用 Web 模式,自動配合 HTTP Request 生命週期管理 SessionScope:
<activerecord isWeb="true">
<config>...</config>
</activerecord>
Global.asax 初始化:
protected void Application_Start(object sender, EventArgs e) {
var source = (IConfigurationSource)ConfigurationManager.GetSection("activerecord");
ActiveRecordStarter.Initialize(source, typeof(Blog), typeof(Post));
}
<activerecord>
<config>
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" />
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="hibernate.connection.connection_string" value="Data Source=.;Initial Catalog=Test;UID=sa;Password=sa" />
</config>
</activerecord>
<activerecord>
<config>
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.OracleClientDriver" />
<add key="hibernate.dialect" value="NHibernate.Dialect.OracleDialect" />
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="hibernate.connection.connection_string" value="Data Source=ORCL;User ID=scott;Password=tiger" />
</config>
</activerecord>
<activerecord>
<config>
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.MySqlDataDriver" />
<add key="hibernate.dialect" value="NHibernate.Dialect.MySQLDialect" />
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="hibernate.connection.connection_string" value="Server=localhost;Database=test;Uid=root;Pwd=123456" />
</config>
</activerecord>
<activerecord>
<config>
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.NpgsqlDriver" />
<add key="hibernate.dialect" value="NHibernate.Dialect.PostgreSQLDialect" />
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="hibernate.connection.connection_string" value="Server=127.0.0.1;Port=5432;Database=test;User Id=postgres;Password=123456" />
</config>
</activerecord>
配置管理是 ActiveRecord 專案的基石。推薦使用 Web.config/App.config 搭配 isWeb="true" 進行 Web 專案部署;獨立元件庫或測試專案適合 XmlConfigurationSource;動態多資料庫場景用 InPlaceConfigurationSource。務必根據目標資料庫選擇正確 Dialect,這是避免 SQL 語法錯誤的關鍵。