上一篇中簡單分享了下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 }
我在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類之間的鏈接關係。