NHibernate 3 Lambda 配置实体二级缓存教程
2026-09-21 3466958
2026-09-21 0
从实际处理来看,NHibernate 3 的 lambda-configuration 写法是在 Configuration 上调用 Cache(...)、Mappings(...)、Proxy(...) 和 DataBaseIntegration(...),再在 lambda 中为强类型属性赋值。它与 SessionFactory().Integrate... 链式写法最终都写入 Configuration.Properties,只是组织代码的方式不同。
NHibernate.Cfg.Loquacious。
官方测试使用 lambda 为缓存、代理、映射和数据库集成属性赋值,随后直接检查 Configuration.Properties。
using System.Data;
using NHibernate;
using NHibernate.AdoNet;
using NHibernate.Cache;
using NHibernate.Cfg;
using NHibernate.Cfg.Loquacious;
using NHibernate.Dialect;
using NHibernate.Driver;
public static ISessionFactory BuildFactory(string connectionString)
{
var cfg = new Configuration();
cfg.SessionFactoryName("MainSessionFactory");
cfg.Mappings(m =>
{
m.DefaultSchema = "dbo";
});
cfg.Proxy(p =>
{
p.Validation = true;
p.ProxyFactoryFactory();
});
cfg.DataBaseIntegration(db =>
{
db.Dialect();
db.Driver();
db.ConnectionString = connectionString;
db.IsolationLevel = IsolationLevel.ReadCommitted;
db.Batcher();
db.BatchSize = 20;
db.PrepareCommands = true;
db.Timeout = 30;
db.SchemaAction = SchemaAutoAction.Validate;
});
cfg.AddAssembly(typeof(Order).Assembly);
return cfg.BuildSessionFactory();
}
在这个示例中,Order 只用于定位实体程序集。如果映射不在该程序集,就应传入真正包含 .hbm.xml 嵌入资源的类型。
下面的配置演示 API 形状,HashtableCacheProvider 适合本地验证,不能直接当作多节点生产缓存:
cfg.Cache(c =>
{
c.Provider();
c.UseMinimalPuts = true;
c.DefaultExpiration = 300;
c.RegionsPrefix = "orders";
});
这只开启并配置二级缓存基础能力。某个实体是否真正进入二级缓存,还要在映射上指定缓存策略。查询缓存又是独立开关,不应把三者混为一个设置。
| 比较点 | lambda-configuration | SessionFactory() 链式配置 |
|---|---|---|
| 组织方式 | 按 Cache / Mappings / DataBaseIntegration 分块 |
从 SessionFactory 一路向下连接 |
| 中间变量 | 可在 lambda 内用普通条件语句 | 更适合线性、固定配置 |
| 最终结果 | 写入 Configuration.Properties |
写入同一份属性 |
| 混用风险 | 后写的值可能覆盖前值 | 同样存在覆盖 |
从实际处理来看,一个项目最好选定一种主要写法,并将构建 Configuration 的责任集中在一处。这样才能看出某个属性最终由哪段代码决定。
在 BuildSessionFactory() 之前用常量键读回关键属性:
var properties = cfg.Properties;
Console.WriteLine(properties[NHibernate.Cfg.Environment.Dialect]);
Console.WriteLine(properties[NHibernate.Cfg.Environment.ConnectionDriver]);
Console.WriteLine(properties[NHibernate.Cfg.Environment.BatchSize]);
Console.WriteLine(properties[NHibernate.Cfg.Environment.DefaultSchema]);
预期能看到 SQL Server 方言、SqlClientDriver、批大小 20 和 schema dbo。不要将 ConnectionString 输出到生产日志。
随后调用 BuildSessionFactory()。如果配置了 SchemaAutoAction.Validate,它会在映射与数据库结构不一致时直接报错,这比到首次查询才发现列名错误更容易定位。
DataBaseIntegration:检查 using NHibernate.Cfg.Loquacious; 和 NHibernate 版本。db.Timeout 命令超时,前者通常在连接字符串中设置。lambda-configuration 最适合将 NHibernate 3 配置按责任分块:Mappings 处理映射默认值,Proxy 处理延迟加载代理,DataBaseIntegration 处理数据库连接与命令。配置后读回关键属性,再构建一次 SessionFactory,就能同时获得可读性和可验证性。