NHibernate3版本新特性介紹

NHibernate3版本新特性介紹

NHibernate久經版本之後,終於也到NHibernate 3版本,今天爲大夥介紹下NHibernate 3新版本的新特性!

下面是NHibernate3版本新特性:

Configuration部分

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

對於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<T>()擴展方法創建一個NHibernate.Linq查詢。

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

其他

還有其他一些新特性:

重構Logging Abstraction日誌系統模塊:移除對log4net.dll程序集依賴,現在可以用CommonLogging或者NLog日誌系統。可以參考Using NLog via Common.Logging with NHibernate。

屬性延遲加載和No Proxy關聯特性:具體使用方法可以參考Ayende的NHibernate new feature: Lazy Properties和NHibernate new feature: No proxy associations兩篇博文。它僅支持Castle的bytecode-providers,不支持Spring.Net和LinFu代理。

映射支持XDocument、System.Uri、XmlDoc、Local & Utc DateTime類型。

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是一款開源工具,其他都是商業版本。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章