详情

首页手游攻略 NHibernate 3 fluent-configuration 属性配置教程

NHibernate 3 fluent-configuration 属性配置教程

佚名 2026-09-21 19:30:01

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

开始前的条件

  • 项目引用 NHibernate 3.0.x 及对应的字节码代理组件。
  • 已确定数据库类型和 ADO.NET 驱动;下文用 SQL Server 作贯穿示例。
  • 实体映射文件以嵌入资源方式编译,或已准备好可显式加载的映射。
  • 在应用启动阶段创建一次 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,因此两种方式不应对同一属性重复赋予不同值。

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<ProxyFactoryFactory>()
        .Integrate
            .Using<MsSql2005Dialect>()
            .BatchingQueries
                .Through<SqlClientBatchingBatcherFactory>()
                .Each(20)
            .Connected
                .By<SqlClientDriver>()
                .Using(connectionString)
            .CreateCommands
                .Preparing()
                .WithTimeout(30)
            .Schema
                .Validating();

    cfg.AddAssembly(typeof(Order).Assembly);
    return cfg.BuildSessionFactory();
}

这段配置的意义是:

调用 作用 使用时要注意
Named(...) 设置 SessionFactory 名称 只有需要命名/绑定时才配
Proxy.Through<T>() 指定延迟加载代理工厂 组件版本要与 NHibernate 匹配
Using<TDialect>() 选择 SQL 方言 必须与真实数据库版本匹配
By<TDriver>() 选择 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

点击查看更多
推荐专题
热门阅读