技术开发 频道

NHibernate 3新特性:Query新增两大查询

  【IT168 技术文档】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部分

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

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

  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部分

  对于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");

 

  Query部分

  在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();

 

0
相关文章