BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

NHibernate 3版本新特性

| 作者 李永京 关注 0 他的粉丝 发布于 2010年12月15日. 估计阅读时间: 12 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

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.GANHibernate.Validator.1.3.0.Alpha1ConfORM 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<T>()扩展方法创建一个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 PropertiesNHibernate 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版本控制。

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT