最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
NHibernate 3 lambda-configuration 属性配置方法
时间:2026-09-21 19:28:01 编辑:袖梨 来源:一聚教程网
从实际处理来看,NHibernate 3 的 lambda-configuration 写法是在 Configuration 上调用 Cache(...)、Mappings(...)、Proxy(...) 和 DataBaseIntegration(...),再在 lambda 中为强类型属性赋值。它与 SessionFactory().Integrate... 链式写法最终都写入 Configuration.Properties,只是组织代码的方式不同。
前置条件
- NHibernate 3.0.x 项目并引入
NHibernate.Cfg.Loquacious。 - 数据库 provider、方言和连接字符串已确定。
- 映射文件或代码映射已准备好。
- 下文代码按 3.0.0GA API 编写;升级到新主版本时应按新版文档迁移。

官方测试使用 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<NHibernate.ByteCode.LinFu.ProxyFactoryFactory>();
});
cfg.DataBaseIntegration(db =>
{
db.Dialect<MsSql2005Dialect>();
db.Driver<SqlClientDriver>();
db.ConnectionString = connectionString;
db.IsolationLevel = IsolationLevel.ReadCommitted;
db.Batcher<SqlClientBatchingBatcherFactory>();
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<HashtableCacheProvider>();
c.UseMinimalPuts = true;
c.DefaultExpiration = 300;
c.RegionsPrefix = "orders";
});
这只开启并配置二级缓存基础能力。某个实体是否真正进入二级缓存,还要在映射上指定缓存策略。查询缓存又是独立开关,不应把三者混为一个设置。
lambda 写法和 fluent 链怎么选
| 比较点 | 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 版本。 - 构建 SessionFactory 时找不到驱动:检查 provider DLL、类名和部署目录,不要先改方言来“试试”。
- 连接超时:区分 ADO.NET 连接超时与
db.Timeout命令超时,前者通常在连接字符串中设置。 - schema 验证失败:核对数据库、默认 schema、映射资源和迁移版本。
- 启动很慢:确认没有在每次请求中重建 SessionFactory。
总结
lambda-configuration 最适合将 NHibernate 3 配置按责任分块:Mappings 处理映射默认值,Proxy 处理延迟加载代理,DataBaseIntegration 处理数据库连接与命令。配置后读回关键属性,再构建一次 SessionFactory,就能同时获得可读性和可验证性。
相关文章
- 把MCP看作AI时代的USB-C:开发者为何都在讨论它 09-21
- 如何打造对 Agent 友好的网站 09-21
- Thinkphp5分页后携带参数跳转传递功能实现 09-21
- 用 RAG 扩展答疑机器人的知识边界 09-21
- RAG 重排序优化:如何把检索准确率从 70% 提升至 90% 09-21
- 安防通行场景的人脸抓拍与识别实践 09-21