NHibernate 3 Lambda 配置实体二级缓存教程
2026-09-21 3466958
2026-09-21 0
NHibernate 3 可通过 NHibernate.Cfg.Loquacious 的 SessionFactory() 扩展用链式语法设置缓存、代理、方言、驱动、连接字符串和命令属性。配置完后仍然要加载映射,最后调用 BuildSessionFactory();链式 API 只是把强类型调用转换为普通 NHibernate 属性。
ISessionFactory,不要每个请求重建。using NHibernate;
using NHibernate.AdoNet;
using NHibernate.ByteCode.LinFu;
using NHibernate.Cfg;
using NHibernate.Cfg.Loquacious;
using NHibernate.Dialect;
using NHibernate.Driver;
Loquacious 意为可读的“多话式”配置接口。它与 Configuration.SetProperty() 操作同一份 Configuration.Properties,因此两种方式不应对同一属性重复赋予不同值。

官方 3.0.0GA 源码测试展示了 SessionFactory().Caching...Integrate... 的链式结构。
把下面代码放在应用启动或专门的 SessionFactoryBuilder 中,将连接字符串替换为实际值:
public static ISessionFactory BuildSessionFactory(string connectionString)
{
var cfg = new Configuration();
cfg.SessionFactory()
.Named("MainSessionFactory")
.Proxy
.Through()
.Integrate
.Using()
.BatchingQueries
.Through()
.Each(20)
.Connected
.By()
.Using(connectionString)
.CreateCommands
.Preparing()
.WithTimeout(30)
.Schema
.Validating();
cfg.AddAssembly(typeof(Order).Assembly);
return cfg.BuildSessionFactory();
}
这段配置的意义是:
| 调用 | 作用 | 使用时要注意 |
|---|---|---|
Named(...) |
设置 SessionFactory 名称 | 只有需要命名/绑定时才配 |
Proxy.Through |
指定延迟加载代理工厂 | 组件版本要与 NHibernate 匹配 |
Using |
选择 SQL 方言 | 必须与真实数据库版本匹配 |
By |
选择 ADO.NET 驱动 | 还需在部署环境提供相应 provider |
Each(20) |
设置 ADO 批量大小 | 需根据驱动和业务调整 |
Preparing() |
开启命令预处理 | 具体收益取决于 provider |
WithTimeout(30) |
命令超时秒数 | 不是连接超时 |
Validating() |
启动时验证 schema | 不会自动修改表结构 |
从实际处理来看,在构建 ISessionFactory 前,可用 NHibernate 的属性常量做定向检查:
string dialect = cfg.Properties[NHibernate.Cfg.Environment.Dialect];
string driver = cfg.Properties[NHibernate.Cfg.Environment.ConnectionDriver];
string batchSize = cfg.Properties[NHibernate.Cfg.Environment.BatchSize];
它们应分别对应方言类、驱动类和 20。不要记录完整连接字符串,因为其中可能包含数据库密码。
再做一个最小连接验证:
using (ISession session = sessionFactory.OpenSession())
using (ITransaction tx = session.BeginTransaction())
{
session.CreateSQLQuery("select 1").UniqueResult();
tx.Commit();
}
当前账号需要有执行这条查询的权限。成功标志是 BuildSessionFactory() 通过 schema 验证,且能打开 Session 并完成查询。
SessionFactory()先检查是否引入 NHibernate.Cfg.Loquacious,再确认项目参考的是 NHibernate 3.0.x。新版 NHibernate 的启动 API 已有变化,不能把这段 3.0.0GA 语法直接搬到任意版本。
检查 LinFu 或实际选用的代理组件 DLL 是否随应用部署,且强名称和版本与 NHibernate 相容。若实体要采用子类代理,类和需延迟加载的成员不能被不恰当地封闭。
Validating() 只比对映射与数据库,不会帮你创建表。确认连接的 catalog/schema 正确,映射资源已加载,数据库迁移已先执行。
NHibernate 3 的 fluent-configuration 使配置项按 SessionFactory、代理、连接和命令分组,比手写字符串键更容易发现错配。正确顺序是:选定匹配 3.0.x 的组件,用 SessionFactory() 完成属性配置,加载映射,然后构建并复用唯一的 ISessionFactory。