首页
看点啥
插画图片
首页 科技看点 NHibernate 3 fluent-configuration 属性配置教程

NHibernate 3 fluent-configuration 属性配置教程

2026-09-21 0

NHibernate 3 可通过 NHibernate.Cfg.LoquaciousSessionFactory() 扩展用链式语法设置缓存、代理、方言、驱动、连接字符串和命令属性。配置完后仍然要加载映射,最后调用 BuildSessionFactory();链式 API 只是把强类型调用转换为普通 NHibernate 属性。

开始前的条件

引入命名空间

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,因此两种方式不应对同一属性重复赋予不同值。

NHibernate 3.0.0GA 官方测试中的 fluent 配置链

官方 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 不会自动修改表结构

确认属性真的写入了 Configuration

从实际处理来看,在构建 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 相容。若实体要采用子类代理,类和需延迟加载的成员不能被不恰当地封闭。

schema validation 报表或列不存在

Validating() 只比对映射与数据库,不会帮你创建表。确认连接的 catalog/schema 正确,映射资源已加载,数据库迁移已先执行。

总结

NHibernate 3 的 fluent-configuration 使配置项按 SessionFactory、代理、连接和命令分组,比手写字符串键更容易发现错配。正确顺序是:选定匹配 3.0.x 的组件,用 SessionFactory() 完成属性配置,加载映射,然后构建并复用唯一的 ISessionFactory

喜欢(0)

上一篇

NHibernate 3 lambda-configuration 属性配置方法

NHibernate 3 lambda-configuration 属性配置方法

下一篇

ASP.NET 缓存与 GZIP 页面性能优化教程

ASP.NET 缓存与 GZIP 页面性能优化教程
猜你喜欢