本身開發輕量級ORM(三)

上一篇中簡單分享了下ORM的設計思路。如今開始講如何用代碼來實現上篇的設計模型。數據庫

咱們建2個類庫來分別抽象數據庫表結構關係映射和SQL增刪改查操做。ide

打開VS2010,新建2個類庫。分別起名爲Model,和DAL。函數

Model層爲數據庫表結構關係映射ui

DAL層爲 SQL增刪改查操做的方法抽象封裝spa

 

咱們先從Model層開始。.net

數據庫的表會包含表名,字段名稱,字段類型,主鍵,外鍵等主要元素。咱們在項目中爲每張表創建一個Model類來抽象描述。設計

在Model類中咱們定義常量TableName,用來描述數據庫表名稱。爲表的字段逐一添加Model類屬性,屬性名和字段名相同。code

因爲SQL字段類型和.net數據類型不一致,咱們在字段屬性上添加自定義特性類DBType來描述對應的SQL字段類型。blog

字段會有主鍵,外鍵標識或者是虛擬字段標識。咱們在字段屬性上添加自定義特性類DBField來描述他們。get

如:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using Model.Entities;
 6 using System.Data;
 7 namespace Model
 8 {
 9     [Serializable]
10     public class EmpInfoModel : BaseEntity
11     {
12         /// <summary>是否能夠修改
13         /// </summary>
14         public const bool isCanMod = false;
15         /// <summary>數據庫表名
16         /// </summary>
17         public const String TableName = "EmpInfo";
18         public EmpInfoModel()
19         { }
20 
21         private string _Id;
22         private string _Name;
23         private int? _isAllMoneyCheck;
24         private Guid? _MyGuid;
25         private Int16? _MySmallint;
26         private bool? _MyBool;
27         private string _Myntext;
28         [DBField(KeyType = DbKeyType.PK)]//主鍵標識
29         [DBType(SqlDBType = SqlDbType.NVarChar)]//字段對應SQLSERVER數據庫字段類型
30         public virtual string Id
31         {
32             set { _Id = value; }
33             get { return _Id; }
34         }
35 
36         public string Name
37         {
38             set { _Name = value; }
39             get { return _Name; }
40         }
41 
42 
43         public int? isAllMoneyCheck
44         {
45             set { _isAllMoneyCheck = value; }
46             get { return _isAllMoneyCheck; }
47         }
48 
49         [DBType(SqlDBType = SqlDbType.UniqueIdentifier)]//字段對應SQLSERVER數據庫字段類型
50         public Guid? MyGuid
51         {
52             set { _MyGuid = value; }
53             get { return _MyGuid; }
54         }
55 
56         [DBType(SqlDBType = SqlDbType.SmallInt)]//字段對應SQLSERVER數據庫字段類型
57         public Int16? MySmallint
58         {
59             set { _MySmallint = value; }
60             get { return _MySmallint; }
61         }
62 
63         [DBType(SqlDBType = SqlDbType.Bit)]//字段對應SQLSERVER數據庫字段類型
64         public bool? MyBool
65         {
66             set { _MyBool = value; }
67             get { return _MyBool; }
68         }
69         [DBType(SqlDBType = SqlDbType.NText)]//字段對應SQLSERVER數據庫字段類型
70         public string Myntext
71         {
72             set { _Myntext = value; }
73             get { return _Myntext; }
74         }
75     }
76 }
View Code

 

 

我在Model類庫下添加DbKeyType類,TableJoinType類,DBFieldAttribute類,DBJoinAttribute類,DBTableAttribute類,DBTypeAttribute類。

DbKeyType類爲字段鍵值枚舉類,枚舉值包含字段否爲主鍵,外鍵,無,和虛擬字段。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Model.Entities
 7 {
 8     /// <summary>
 9     /// 建立人:雷旭鵬(leo) 2014-1-13 
10     /// 聯繫方式:leixupeng823@163.com
11     /// </summary>
12     public enum DbKeyType:int
13     {
14         Filed = 0,
15         PK = 1,
16         FK = 2,
17         /// <summary>只用於承載數據
18         /// </summary>
19         DataFiled = 3
20     }
21 }

TableJoinType爲錶鏈接類型枚舉類

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Model.Entities
 7 {
 8     /// <summary>
 9     /// 建立人:雷旭鵬(leo) 2014-1-13
10     /// 聯繫方式:leixupeng823@163.com
11     /// </summary>
12     public enum TableJoinType : int
13     {
14         INNER_JOIN = 0,
15         LEFT_JOIN = 1,
16         RIGHT_JOIN = 2
17     }
18 }

DBFieldAttribute類爲字段鍵值特性標識類

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Model.Entities
 7 {
 8     /// <summary>字段特性 
 9     /// 建立人:雷旭鵬(leo) 2014-1-13
10     /// 聯繫方式:leixupeng823@163.com 
11     /// </summary>
12     [AttributeUsage(AttributeTargets.Property, Inherited = false)]
13     public sealed class DBFieldAttribute : Attribute
14     {
15         /// <summary>字段名稱 
16         /// </summary>
17         public string FieldName
18         {
19             get;
20             set;
21         }
22         /// <summary>鍵類型
23         /// </summary>
24         public DbKeyType KeyType
25         {
26             get;
27             set;
28         }
29         /// <summary>字段數據類型 
30         /// </summary>
31         public Type PropertyType
32         {
33             get;
34             set;
35         }
36         /// <summary>構造函數 
37         /// </summary>
38         public DBFieldAttribute()
39         { }
40     }
41 }

DBJoinAttribute類爲關係錶鏈接類型特性標識類

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Model.Entities
 7 {
 8     /// <summary>連接屬性 
 9     /// 建立人:雷旭鵬(leo) 2014-1-13
10     /// 聯繫方式:leixupeng823@163.com
11     /// </summary>
12     [AttributeUsage(AttributeTargets.Property, Inherited = false)]
13     public sealed class DBJoinAttribute : Attribute
14     {
15         /// <summary>主鍵
16         /// </summary>
17         public string PK
18         {
19             get;
20             set;
21         }
22         /// <summary>外鍵 
23         /// </summary>
24         public string FK
25         {
26             get;
27             set;
28         }
29         /// <summary>錶鏈接關係
30         /// </summary>
31         public TableJoinType JoinType
32         {
33             get;
34             set;
35         }
36         /// <summary>構造函數
37         /// </summary>
38         public DBJoinAttribute()
39         { }
40     }
41 }

DBTableAttribute類用於鏈接是標識相應表名

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Model.Entities
 7 {
 8     /// <summary>所屬表屬性 
 9     /// 建立人:雷旭鵬(leo) 2014-1-13
10     /// 聯繫方式:leixupeng823@163.com 
11     /// </summary>
12     [AttributeUsage(AttributeTargets.Property, Inherited = false)]
13     public sealed class DBTableAttribute : Attribute
14     {
15         /// <summary>表名稱
16         /// </summary>
17         public string TableName
18         {
19             get;
20             set;
21         }
22         /// <summary>表暱稱
23         /// </summary>
24         public string TableNickName
25         {
26             get;
27             set;
28         }
29         /// <summary>構造函數 
30         /// </summary>
31         public DBTableAttribute()
32         {
33         }
34     }
35 }

DBTypeAttribute類爲標識字段對應SQLSERVER字段類型標識類

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Data;
 6 namespace Model.Entities
 7 {
 8     [AttributeUsage(AttributeTargets.Property, Inherited = false)]
 9     public sealed class DBTypeAttribute : Attribute
10     {
11          /// <summary>SQL數據庫字段類型
12         /// </summary>
13         public SqlDbType SqlDBType
14         {
15             get;
16             set;
17         }
18         /// <summary>構造函數 
19         /// </summary>
20         public DBTypeAttribute()
21         {
22         }
23     }
24 }

經過添加上面的類,咱們如今能夠對數據庫表進行抽象,用對應的特性標識字段是否爲主鍵,外鍵或者爲虛擬字段,SQL字段於.net類型的轉換關係。各Model類之間的鏈接關係。

相關文章
相關標籤/搜索