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版本,需要注意下面改變:
- NHibernate3.0.0版本不支持.Net3.5以下版本,即.Net2.0版本不可以升級到NHibernate3.0.0版本。
- [NH-2392]ICompositeUserType.NullSafeSet方法簽名改變。
- [NH-2199]maps/dictionaries中null值不再不加提示地忽略/刪除。
- [NH-1894]SybaseAnywhereDialect刪除,代之以SybaseASA9Dialect。刪除了Sybase Adaptive Server Enterprise (ASE)方言。
- [NH-2251]Dialect中的GetLimitString簽名變化。
- [NH-2284]刪除了過時的成員。
- [NH-2358]DateTimeOffset類型現在不再是DateTime的替代。
實用工具
最近一年,網絡上出現了一些優秀的NHibernate工具:
- HQL Language Service for Visual Studio:爲我們編寫HQL查詢提供了智能提示和語法驗證檢查功能。
- NHibernate Profile:可視化NHibernate性能檢測優化工具。
- Visual NHibernate:可視化設計和映射工具。
- Mindscape NHibernate Designer:VS設計工具,類似於EF設計器。
其中HQL Language Service for Visual Studio是一款開源工具,其他都是商業版本。