構造我自己的ORM
通過前面兩章的描述,我相信很多朋友都已經明白 我了下面將要討論到的ORM的實現方法了,那就是根據自定義Attribute來定義 O/R Mapping規則,然後通過反射來動態獲取此規則,動態構造SQL語句。
由於這個小東西(ORM)出生在深圳,所以我想來想去,她應該有個深圳 的名字,所以我就叫她“MiniORM”。不知道各位認為如何?
MiniORM采用的是ONE_INHERIT_TREE_ONE_CLASS(一個繼承樹對應於一個 表)的結構,雖然這種結構容易導致數據冗余,但是這種結構很簡單。另,本 MiniORM 僅僅考慮一個表一個PK,一個FK的情況。
MiniORM結構如下,為 了更便於理解和使用,我使用了3個類:
1、OrmWriter:負責將實體對象 (比如前面章節說的Person)插入數據庫和修改數據庫中對應的記錄。
2 、OrmRemover:負責根據實體對象,刪除指定的記錄;
3、OrmReader: 負責根據實體對象,讀取指定的記錄;
上面就是MiniORM的3個主要類。下面我們就詳細地根據前面的描述一 步步構造她。我們這裡還是以前面說的Person為例進行說明。
通過本系 列第一章,我們知道,對象不但存在繼承關系,特別在實際的應用中還存在包含 關系,比如一個Person包含兩個Hand(手)類,包含一個Head(頭)類等,我們 的Person在數據庫中應該有一個ID,為了更加方便使用和討論,此ID在MiniORM 中是一個int以及自動增長類型(ID INDENTITY(1,1))。這些都是我們的 MiniORM應該考慮的范圍。
我們對我們的Person做修改:
[DataObjectAttribute("Person")]
public class Person
{
private int _ID;
private string _Name;
private int _Age;
private string _Sex;
private Head _Head;
private Hand _LeftHand;
private Hand _RightHand;
public int ID
{
get { return _ID; }
set { _ID = value; }
}
public Head Head
{
get { return _Head; }
set { _Head = value; }
}
public Hand LeftHand
{
get { return _LeftHand; }
set { _LeftHand = value; }
}
public Hand RightHand
{
get { return _RightHand; }
set { _RightHand = value; }
}
[DataFIEldAttribute("name", "NvarChar")]
public string Name
{
get { return this._Name; }
set { this._Name = value; }
}
[DataFIEldAttribute("age", "int")]
public int Age
{
get { return this._Age; }
set { this._Age = value; }
}
[DataFIEldAttribute ("sex", "NvarChar")]
public string Sex
{
get { return this._Sex; }
set { this._Sex = value; }
}
}