您的位置:首页 > 手游攻略 > NHibernate 3 lambda-configuration 属性配置方法

NHibernate 3 lambda-configuration 属性配置方法

作者:互联网  时间: 2026-09-21 19:50: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 编写;升级到新主版本时应按新版文档迁移。

NHibernate 3.0.0GA 官方测试中的 lambda 配置

官方测试使用 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,它会在映射与数据库结构不一致时直接报错,这比到首次查询才发现列名错误更容易定位。

排查顺序

  1. 编译期找不到 DataBaseIntegration:检查 using NHibernate.Cfg.Loquacious; 和 NHibernate 版本。
  2. 构建 SessionFactory 时找不到驱动:检查 provider DLL、类名和部署目录,不要先改方言来“试试”。
  3. 连接超时:区分 ADO.NET 连接超时与 db.Timeout 命令超时,前者通常在连接字符串中设置。
  4. schema 验证失败:核对数据库、默认 schema、映射资源和迁移版本。
  5. 启动很慢:确认没有在每次请求中重建 SessionFactory。

总结

lambda-configuration 最适合将 NHibernate 3 配置按责任分块:Mappings 处理映射默认值,Proxy 处理延迟加载代理,DataBaseIntegration 处理数据库连接与命令。配置后读回关键属性,再构建一次 SessionFactory,就能同时获得可读性和可验证性。

最新游戏

更多

Copyright©2010-2019. All rights reserved | 波波三国游戏官网|[email protected]

备案编号:湘ICP备2022015115号-4