天天看點

一起談.NET技術,NHibernate3剖析:Mapping篇之ConfORM實戰(1):概覽  ORuM思想浮出  ConfORM概述  ConfORM初試  結語  參考資料

  對于ORM(Object Relational Mapping)我們太熟悉了,但是我們從另一個角度可以想象出ORuM(Object Relational un-Mapping)的思想理念。我們在程式中僅僅定義Domain,

而想有個工具可以幫助我們"自動化"實作Mapping,我們無需按傳統的ORM思想那樣為Domain手動編碼Mapping。

  ORuM對于使用者來說更像ORAM(Object-Relational Auto-Mapping)或者ORIM(Object-Relational Intelligent-Mapping)的意思。

  有沒有這樣的實作呢?答案是相當肯定的。

  ConfORM是NHibernate貢獻者Fabio Maulo大牛設計的,是一個配置ORM的工具,其接口按照ORM思想定義,基于GNU Lesser General Public License協定。其設計思想來源就是

ORuM(Object Relational un-Mapping)。它按照Domain定義幫助我們"自動"實作Mapping。現在僅僅實作了對NHibernate的"自動"Mapping,如果有興趣的話,可以添加對EF實作自動Mapping功能。

  那麼ConfORM到底如何"自動"的呢?

  NHibernate對Mapping的處理過程,就是将XML檔案反序列化為HbmMapping類,再将HbmMapping類Bind為Mappings,最後Bind SessionFactory。而ConfORM就是利用Domain定

義實作自動生成HbmMapping類,完全避免了編寫XML檔案和反序列化。這樣的話,ConfORM正是起到了ORAWM“object to relational adapter without mappings"的作用。

擷取ConfORM

  這是這個系列的第一篇,我們用一個簡單的例子實作一下吧,以後慢慢介紹其細節。首先我們寫下NHibernate基礎代碼和通用代碼,這一步的代碼在将來的文章中也經常使用,以後就不單獨貼出來了。

  ConfigureNHibernate()方法用于配置NHibernate,Serialize方法用于輸出。我們開始ConfORM之旅吧:

  開始之旅,我們總是從最簡單的入手,将來慢慢學習ConfORM到底如何"自動"為我們複雜的Domain結構生成出Mapping的。

  這一步非常重要,是ConfORM的核心所在,執行個體化一個ObjectRelationalMapper對象,裝配Domain對象,執行個體化Mapper對象,調用Mapper對象的CompileMappingFor()方法自動生成HbmMapping。

  這一步關鍵環節是調用Configuration對象的AddDeserializedMapping()方法添加HbmMapping和配置中繼資料。

  好了,做了上面3步就完成了我們的測試:NHibernate自動建立資料庫架構、持久化資料、删除資料、最後把資料庫架構删除。這時大家都有一個疑問,ConfORM自動生成的HbmMapping是什麼啊?

序列化HbmMapping對象到底輸出什麼?為了滿足大家的需求我們寫段代碼讓ConfORM列印出XML,對照我們以往手寫的*.hbm.xml檔案看看是否符合:

  這時,我們打開輸出目錄的MyMapping.hbm.xml檔案看看内容:

  恩,是手寫的完全一樣,ConfORM可以意識到Domain類的成員,Id為主鍵使用了hilo生成政策,Name為屬性。咦,難道隻會這樣生成?答案當然不是,ConfORM提供了很多模式和定制化,這方面在以後一一介紹。

  僅僅使用了第二步的那幾行代碼就完成了自動映射的功能,是不是很酷,看過這篇文章後,你是不是非常急切的想跟着我學習下ConfORM,然後試着重構自己的老程式,抛掉hibernate.cfg.xml和*.hbm.xml檔案了啊。

(VS2010項目)