zoukankan      html  css  js  c++  java
  • 自己开发轻量级ORM(三)

    上一篇中简单分享了下ORM的设计思路。现在开始讲如何用代码来实现上篇的设计模型。

    我们建2个类库来分别抽象数据库表结构关系映射和SQL增删改查操作。

    打开VS2010,新建2个类库。分别起名为Model,和DAL。

    Model层为数据库表结构关系映射

    DAL层为 SQL增删改查操作的方法抽象封装

    我们先从Model层开始。

    数据库的表会包含表名,字段名称,字段类型,主键,外键等主要元素。我们在项目中为每张表建立一个Model类来抽象描述。

    在Model类中我们定义常量TableName,用来描述数据库表名称。为表的字段逐一添加Model类属性,属性名和字段名相同。

    由于SQL字段类型和.net数据类型不一致,我们在字段属性上添加自定义特性类DBType来描述对应的SQL字段类型。

    字段会有主键,外键标识或者是虚拟字段标识。我们在字段属性上添加自定义特性类DBField来描述他们。

    如:

     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类之间的连接关系。

  • 相关阅读:
    Unsafe(转载) 规格严格
    MySQL 中文 规格严格
    2007“奥普迪杯”开放式实时在线辞典系统设计大赛
    2007“奥普迪杯”开放式实时在线辞典系统设计大赛
    2007年个人回忆与总结
    蔡学镛:2008编程语言走势解盘
    用scanf实现gets的功能
    2007年个人回忆与总结
    用scanf实现gets的功能
    初学入门:如何有效编写软件的75条建议
  • 原文地址:https://www.cnblogs.com/tuolei/p/3564885.html
Copyright © 2011-2022 走看看