写点什么

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:296089

评论

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

YashanDB巡检

YashanDB

数据库 yashandb

08.面向对象的特性

杨充

HarmonyOS:@AnimatableExtend 装饰器自学指南

李游Leo

HarmonyOS HarmonyOS NEXT

备赛指南 | 4C大赛大数据主题赛多届国赛获奖作品指导老师经验分享实录已整理!

ModelWhale

Python 人工智能 大数据 中国大学生计算机设计大赛

HarmonyOS NEXT 基于原生能力获取视频缩略图

威哥爱编程

HarmonyOS ArkTS HarmonyOS框架 HarmonyOS NEXT

SvelteKit 最新中文文档教程(9)—— 部署静态站点与单页应用

冴羽

vue.js 前端 React Svelte SvelteKit

2025杭州国际安防产品博览会(浙江安博会)

AIOTE智博会

安博会 浙江安博会

YashanDB dump

YashanDB

数据库 yashandb

淘宝商品SKU信息抓取实战:5步搞定API封装(附代码)

代码忍者

淘宝API接口

如何在IDEA中借助深度思考模型 QwQ 提高编码效率?

阿里云云效

阿里云 云原生 通义灵码

Spring Boot 与 MyBatis Plus 整合 KWDB 实现 JDBC 数据访问

KaiwuDB

数据库 KaiwuDB

P6户外LED显示屏的特点有哪些?

Dylan

广告 LED显示屏 全彩LED显示屏 户外LED显示屏 led显示屏厂家

金三银四真实面经分享

王中阳Go

Go 面试 后端

FeedbackStream:8 分钟创建 AI 面试智能体;Moshi 开源图像理解实时语音模型 MoshiVis 丨日报

声网

AI招聘APP的核心功能

北京木奇移动技术有限公司

AI智能体 AI招聘 软件外包公司

AI招聘APP的技术难点

北京木奇移动技术有限公司

AI智能体 AI招聘 软件外包公司

AI招聘APP的技术框架

北京木奇移动技术有限公司

AI应用 AI招聘 软件外包公司

最佳实践 | 在 EMR Serverless Spark 中实现 Doris 读写操作

阿里云大数据AI技术

大数据 spark Serverless 云原生 EMR

AI招聘APP的上线

北京木奇移动技术有限公司

AI智能体 AI招聘 软件外包公司

如何在IDEA中借助深度思考模型 QwQ 提高编码效率?

阿里巴巴云原生

阿里云 云原生 通义灵码

HarmonyOS NEXT 实现拖动卡片背景模糊效果

威哥爱编程

HarmonyOS HarmonyOS框架 HarmonyOS NEXT

Rust 开发者必备:三分钟搞定视频缩略图生成

Yeauty

rust ffmpeg Video media audio

广告发布平台(源码+文档+讲解+演示)

深圳亥时科技

哈尔滨网络安全等级保护测评

黑龙江陆陆信息测评部

AI赋能时尚零售:与多变时代对话的新篇章

第七在线

Apache SeaTunnel同步MySQL到Doris的优化策略

Apache SeaTunnel

《Operating System Concepts》阅读笔记:p473-p480

codists

操作系统

低代码实验案例设计图文操作指南!4C大赛 AI 通识教育实验创新微课赛道火热报名中

ModelWhale

#人工智能 中国大学生计算机设计大赛 4C大赛 #微课 #教育

北京国家会计学院“数智财务高端人才”培养项目启动报名!

用友智能财务

财务 会计

年薪50W+的测试开发工程师,都在偷偷学这些技能

测试人

软件测试

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