写点什么

NHibernate 3 版本新特性

  • 2010-12-14
  • 本文字数:2621 字

    阅读完需:约 9 分钟

2010 年 12 月 4 号 Fabio Maulo 发布了 NHibernate 3.0.0.GA 正式版本,基于.Net3.5 和.NET 3.5 Client Profile 平台,主要改变是增加 Loquacious 配置和基于 Lambda 表达式查询和 Linq 查询。你可以到这里下载NHibernate 3.0.0.GA。接着Fabio Maulo 陆续发了 NHibernate.Caches.3.0.0.GA NHibernate.Validator.1.3.0.Alpha1 ConfORM 1.0.1.2

下面是 NHibernate 3 版本新特性:

在 Configuration 部分新增两种 Loquacious-Configuration 方式:流配置 (fluent-configuration)lambda 表达式配置 (lambda-configuration)

fluent-configuration 顾名思义,使用 Fluent API 配置 SessionFactory 属性,提供强类型支持、编译期错误检查等。你可以通过 SessionFactory fluent 配置了解详细信息。例如使用流配置方式最小配置 NHibernate:

复制代码
var configure = new Configuration();
configure.SessionFactory()
.Named("Demo")
.Proxy.Through<ProxyFactoryFactory>()
.Integrate
.Using<MsSql2008Dialect>()
.Connected
.Using("ConnectionString");

lambda-configuration 是利用 C#3.0 扩展方法 (Extension Methods) 配置 SessionFactory 属性。你可以通过 Configuration 篇之 SessionFactory lambda 配置 Cache lambda-configuration 配置了解详情。例如使用 lambda 表达式方式最小配置 NHibernate:

复制代码
var configure = new Configuration();
configure.SessionFactoryName("Demo");
configure.Proxy(p => p.ProxyFactoryFactory<ProxyFactoryFactory>());
configure.DataBaseIntegration(db =>
{
db.Dialect<MsSql2008Dialect>();
db.Driver<SqlClientDriver>();
db.ConnectionString = ConnectionString;
});

新增WcfOperationSessionContext 类提供对 WCF 环境的支持,我们直接配置"current_session_context_class"为"wcf_operation"在 WCF 环境中应用 NHibernate。

对于 Mapping 部分,Fabio Maulo 完全重构了 NHibernate.Cfg.MappingSchema 代码部分,提高了性能。同时为 NHibernate 专门设计了一个配置 ORM 工具—— ConfORM :解析 Domain 结构,按照模式适配器和自定义配置生成 HbmMapping 类,避免 NHibernate 通过读取 XML 映射文件反序列化等方式生成 HbmMapping 类的过程。不过 ConfORM 不是 NHibernate 的一部分,需要另外单独下载。李永京在自己的博客中介绍了这个工具,可以参考 ConfORM 概览原理 OneToOne 语义 ManyToMany 语义 Component 语义。我们可以这样使用:

复制代码
var orm = new ObjectRelationalMapper();
orm.TablePerClass<Domain>();
var mapper = new Mapper(orm);
var hbmMapping= mapper.CompileMappingFor(new[] { typeof(Domain) });

在 Configuration 类中新增了AddDeserializedMapping(HbmMapping mappingDocument, string documentFileName) 方法,可以直接解析 HbmMapping,这样选择不使用 xml 文件而是 ConfORM。例如上面使用 ConfORM 生成的 hbmMapping 我们加到 Configuration 中:

复制代码
var conf=new Configuration();
//...
conf.AddDeserializedMapping(hbmMapping, "Domain");

在 NHibernate 3.0.0 版本中,Query 方式新增了Linq 支持强类型查询 API(QueryOver)两种查询方式。

QueryOver 是 Lambda 表达式方式的条件 (Criteria) 查询,可读性强且支持 property-renaming 特性。可以参考 QueryOver in NH 3.0 。例如下面查询 Name 为李永京、按照 Age 降序的 Person 集合:

复制代码
var query = s.QueryOver<Person>()
.Where(p => p.Name == " 李永京 ")
.OrderBy(p => p.Age).Asc
.List();

Linq 基于 HQL AST 分析器的 Linq Provider 实现,由 Steve Strong 贡献者开发的,底层使用第三方 Re-Linq 开源框架。不过 NHibernate3.0.0 版本提供的 Linq 查询还处于 Bate 阶段,Fabio Maulo 准备发布 3.1 版本修复 Linq 查询 BUG。可以参考: NHibernate.Linq 标准查询增强查询自定义扩展。我们使用ISession 接口的Query () 扩展方法创建一个 NHibernate.Linq 查询。

复制代码
var query = session.Query<Person>().Where(o => o.Name == " 李永京 ").ToList();

还有其他一些新特性:

  1. 重构 Logging Abstraction 日志系统模块:移除对 log4net.dll 程序集依赖,现在可以用 CommonLogging 或者 NLog 日志系统。可以参考 Using NLog via Common.Logging with NHibernate
  2. 属性延迟加载和 No Proxy 关联特性:具体使用方法可以参考 Ayende 的 NHibernate new feature: Lazy Properties NHibernate new feature: No proxy associations 两篇博文。它仅支持 Castle 的 bytecode-providers,不支持 Spring.Net 和 LinFu 代理。
  3. 映射支持 XDocument、System.Uri、XmlDoc、Local & Utc DateTime 类型。
  4. bytecode-providers 程序集更新:Castle 使用 2010 年 11 月 15 号发布的 2.5.2 正式版本,即 Castle.Core.dll 程序集。LiuFu 使用 2010 年 4 月 5 号发布的 1.04 版本,即 LinFu.DynamicProxy.dll 程序集。

如果从 NHibernate2.1.2 版本升级到 NHibernate3.0.0 版本,需要注意下面改变:

  1. NHibernate3.0.0 版本不支持.Net3.5 以下版本,即.Net2.0 版本不可以升级到 NHibernate3.0.0 版本。
  2. [NH-2392] ICompositeUserType.NullSafeSet 方法签名改变。
  3. [NH-2199] maps/dictionaries 中 null 值不再不加提示地忽略 / 删除。
  4. [NH-1894] SybaseAnywhereDialect 删除,代之以 SybaseASA9Dialect。删除了 Sybase Adaptive Server Enterprise (ASE) 方言。
  5. [NH-2251] Dialect 中的 GetLimitString 签名变化。
  6. [NH-2284] 删除了过时的成员。
  7. [NH-2358] DateTimeOffset 类型现在不再是 DateTime 的替代。

最近一年,网络上出现了一些优秀的 NHibernate 工具:

  1. HQL Language Service for Visual Studio :为我们编写 HQL 查询提供了智能提示和语法验证检查功能。
  2. NHibernate Profile :可视化 NHibernate 性能检测优化工具。
  3. Visual NHibernate :可视化设计和映射工具。
  4. Mindscape NHibernate Designer :VS 设计工具,类似于 EF 设计器。

其中 HQL Language Service for Visual Studio 是一款开源工具,其他都是商业版本。

据我了解的情况来看,将来的版本发布预计一两个月后会发布 3.1 版本,然后就升级至.Net4 平台开发 NHibernate 4 版本,主要就是逐步改写内部代码去掉 Iesi.Collections.dll,使用.Net4 提供的 ISet 集合和添加一些新功能,比如 Duck Typing (鸭子类型) 等。另外,NHibernate 源码将迁移到 CodePlex 网站,使用 Hg 版本控制。

感谢李永伦对本文的审校。

2010-12-14 07:296204

评论

发布
暂无评论
发现更多内容

大模型扎堆「赶考」,语文还是国产AI行,文言文能力超过95%考生

Openlab_cosmoplat

人工智能 机器学习 AI 高考

Java线程池二、使用线程池进行任务管理

echoes

别着急摆烂,看看你到底值多少钱?

引迈信息

程序员 软件开发 低代码 IT JNPF

LRU缓存策略

不叫猫先生

LRU 6 月 优质更文活动

低代码开发与数智制造:数字转型的无缝结合

加入高科技仿生人

低代码 数智化 数智制造

微服务高并发概念与核心类:调用链上下文与入口类

互联网架构师小马

突破创新!Windows主机助你打造独一无二的网站!

一只扑棱蛾子

Windows主机

华为云 UCS GitOps:轻松交付多集群云原生应用

华为云开发者联盟

华为云 华为云开发者联盟 企业号 6 月 PK 榜

生态伙伴 | 中电创新科技集聚示范区携手华秋硬创,加速智能硬件孵化

华秋电子

Java线程池一、基本概念和原理

echoes

Java 线程池

腾讯企点客服赛道国内TOP1!Gartner报告公布最新市场份额

人称T客

「悦数图数据库」亮相中国国际信息通信展览会,推进图技术产业化发展

悦数图数据库

通信 图数据库

构建财务共享体系,智能化引领转型升级

用友BIP

财务共享

中企出海所面临的几点人力资源挑战

用友BIP

中企出海

浅谈低代码

不叫猫先生

低代码 6 月 优质更文活动

TS中type和interface在类型声明时的区别

不叫猫先生

6 月 优质更文活动

了解 Dubbo:分布式服务框架的基础知识

Apifox

程序员 gRPC dubbo RPC 开发

「悦数图数据库」亮相中国国际信息通信展览会,推进图技术产业化发展

悦数图数据库

通信 图数据库 运营商

eosio.system智能合约介绍(一)账户和权限

BSN研习社

中移链节点动态管控介绍

BSN研习社

javaScript实现动态规划(Dynamic Programming)01背包问题

不叫猫先生

动态规划 JavaScrip 6 月 优质更文活动

阿里云微服务引擎负责人李艳林:云原生网关当道,会带来哪些改变

阿里巴巴云原生

阿里云 微服务 云原生

Postman 和 GraphQL:最佳实践指南

Liam

Java Postman API graphql 接口工具

共享电动单车生产厂家怎么找合适

共享电单车厂家

共享电动车厂家 共享电单车厂商 共享电动车生产 本铯电动车厂家

华为云新一代分布式数据库GaussDB,给世界一个更优选择

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 6 月 PK 榜

云原生中间件套件,如何为企业数字化转型提供支撑

金蝶天燕云

云原生 中间件 信创

电源管理IC下游市场向高端工业和汽车领域转型,这家芯片设计厂商值得关注

华秋电子

实例讲解Flink 流处理程序编程模型

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 6 月 PK 榜

旭阳数字:让焦化行业供应链更数智

用友BIP

数智平台

面向多告警源,如何构建统一告警管理体系?

阿里巴巴云原生

阿里云 云原生 可观测

基于 AIGC,RocketMQ 学习社区探索开源软件学习新范式

阿里巴巴云原生

阿里云 RocketMQ 云原生 AIGC

NHibernate 3版本新特性_.NET_李永京_InfoQ精选文章