天天看點

基于DotNet構件技術的企業級靈活軟體開發平台 - AgileEAS.NET - 資料關系映射ORM

      上一遍我介紹了AgileEAS.NET中統計的資料通路,本文我将來介紹AgileEAS.NET中的ORM實作思路。關于ORM的概念和介紹,我在此就不在重複介紹了,我相信大家都很熟悉這個概念了。

      AgileEAS.NETORM并沒有采用如NHibernate中映射檔案的檔案的模式,而是采用了直接寫死的模式實作,ORM體系設計采用了屬性/列>資料對象>資料集合(表)的結構:

基于DotNet構件技術的企業級靈活軟體開發平台 - AgileEAS.NET - 資料關系映射ORM

      最基本的思路是一個記錄/實體(IEntity)映射一條記錄,一個實體包括若幹屬性/列(Colunm),而一組IEntity和一組Colunm組成一個資料表對象(IEntity),用于對象一個表、視圖、或者一個查詢結果,下面我涉及到的類、接口介紹一下:

Column

      相當于一個資料庫表的一個列。組織于資料庫與資料庫表行中,由1-n個列組成一行資料或一個資料庫表,包含了标題、名稱、資料類型、資料庫列名、大小、值表達式、是否自動增長、值、預設值等屬性。這些屬性友善使用者在定義資料庫實體類及表類時使用,在資料庫屬性類中,正常情況下,一個屬性等同于一個數庫列,但是,一個屬性并不一定關聯一個資料庫列,也可以關聯到一個函數或常量之上。

IEntity     

      實體接口相關于關系資料庫中的一個資料庫表行,把一個資料庫表行映射庫一個資料庫實體類, 以下是他的詳細定義:

      資料庫實體接口和資料表接口是ORM中最核心的一個接口,為什麼說他是最核心的接口呢,他是ORM映射中的資料實體對象(Object)、他和關系資料庫中的關系(表)進行直接的映射、一個資料庫表行就是一個隻有一個元素的關系(即隻有一條記錄的表)、資料表是資料庫表行的一個縱行擴充。 資料庫實體接口中實作了,和資料庫表行映射所需求的屬性集合,同時也提供了Refresh、Insert、Update、Save、Delete資料庫持久化操作和一個CacheRefresh方法。

      Refresh方法是資料實體對象從關系資料庫表行同步自身的一個方法,他從關系資料庫表中取出指定行資料,同步内在中的資料實作對象。

      Save方法是資料實體對象根據把自己同步到關系資料庫表中的一個方法,當資料庫表中存在這條資料行是,修改資料庫表中的這一行,如果資料庫表行中不存在這一行,則向資料庫表中插入這一行。

      Insert方法不進行判讀直接向資料庫插入資料。

      Update方法不進行判讀直接更新資料庫記錄。

      Delete方法是資料實體對象從關系資料庫删除與資料實體對象映射的那一行資料。

      CacheRefresh方法同Refresh隻是不從資料庫而是從緩存。

ITable 

      資料表相關于關系資料庫中的一個資料庫表,把一個資料庫表映射庫一個資料表, 以下是他的詳細定義:

      ITable中我們定義了Columns列集合、Rows行集合,同時也提供了Query、Save、Delete資料庫持久化操作方法和緩存查詢CacheQuery。

      Query方法是資料表對象從關系資料庫表同步自身的一個方法,他從關系資料庫表中取出指定行資料,同步記憶體中的資料表對象。

      Query方法在執行過程中,可以一次全部同步資料庫表資料,也可以根據條件同步資料庫的某一部分資料,在進行條件參數時,需求使用到查詢條件對象(Condition)、查詢條件單元對象(Element)和結果排序單元對象(OrdeElement)、由這三個對象組合成複雜的查詢條件,通過Query方法查詢指定條件的資料。

      Save方法和Delete方法實作和IEntity定義中的有相似的功能,在此先不作介紹。

      CacheQuery實作從緩存同步資料行。

      在上面ORM的對象架構中,涉及到兩個集合類EntityCollection、ColumnCollection在此文不做特别說明,詳細請參考開發包中的類庫幫助,下面我說一下ORM中的查詢條件。

       我們知道在進行資料庫操作中要進行條件查詢,我們把行、列、表都進行了對象映射,那麼SQL條件怎麼辦,AgileEAS.NET中定義了三個類,查詢條件(Condition)、組成條件的元素(Element)、排序條件元素。  

Condition

       條件類是ORM中的一個功能輔助類,他相當于開發人員在編号SQL語句的過程中所編寫的一組查詢條件。條件由條件單元元件,如果條件用于查詢,在查詢時,需要對查詢結果排序,剛需求使用排序條件單元,以下是條件類及條件單元的結構關系:

基于DotNet構件技術的企業級靈活軟體開發平台 - AgileEAS.NET - 資料關系映射ORM

       上圖為條件、條件單元(Element)、排序單元(OrdeElement)之間的類關系圖,條件元素()由方法關聯條件單元及排序單元,條件單元(Element)表示的是一個很簡單的條件元素,比如 NAME = ‘james’, 排序單元(OrdeElement)也隻是表示一個很簡單的排序單元,比如:NAME或 NAME DESC,但是在我們進行的企業應用開發中,條件都是很複雜的,比如有這樣的條件 NAME = ‘james’ And SEX = ‘男’ And Age < 16,這樣的怎麼麼寫,我們使用條件單元組成複雜的條件。這個條件我們使用ORM進行映射:

       Condition condition = table.CreateCondition ();

       condition.AddElement(new Element(“NAME”,”james”);

       condition.AddElement(new Element(“SEX”,”男”);

       condition.AddElement(new Element(“Age”,” 16”);

       這樣就完成了這個條件的定義,在條件的組合及定義條件的過程中,我們就有一個認識,條件并不是光有等值比較,還包括有很多其他的條件類型,同樣,條件的組合不光是And 還有Or組合,下圖是ORM條件映射中的兩個輔助枚舉,列舉條件類型及條件組合類型。

ElementType

       條件類型枚舉,定義某個條件的類型,比如=,<,like之類的:

       在這些定義中,有一個特殊的條件類型,SqlCondition條件類型,我們在進行條件映射時,現實中的資料總是複雜的,有很多無法直接使用各種條件映射出,或者,通過單條件映射元件條件很複雜,我們可以直接使用SQL語句作為條件,在這個時間,就可以使用SqlCondition條件類型。它為我們保留了編寫優質高效SQL語名的接口。

ElementCombineType

       兩個條件或者兩條條件元素的組合方式,OR或者AND

至此,ORM組織體系大概介紹完成,不過在此文中,并未對ORM的資料通路機制,關于這部分我在下文介紹。

      QQ群:15118502

<a href="http://www.cnblogs.com/eastjade/archive/2010/04/19/1715662.html">AgileEAS.NET之靈活并行開發方法</a>

<a href="http://www.agilelab.cn/">靈活軟體工程實驗室</a>