Fork me on GitHub
ORM的实现

 

  前言

 

经过一段时间的编写,终于有出来一个稳定的版本,期间考虑了多种解决方案也偷偷学了下园子里面大神们的作品。

 

已经有很多的ORM框架,为什么要自己实现一个?我的原因是在遇到特殊需求时,可以在ORM中加入特定的代码。如 :根据数据库的字段长度和可空性做基本的数据验证,在ORM中解决数据修改时的同步问题…

 

本文主要关注的是如何实现ORM方面,其它的大家可以参考以下两篇文章:

 

用T4 Template生成代码:参考此文,可以知道本ORM是如何根据数据库,生成实体层代码。有了这个基础,就可以看懂本文本中所有的T4模板。

 

DBHelper (支持事务与数据库变更):参考此文,可以知道本ORM是如何访问数据库,如何支持事务,分页和多种数据库。

 

2  实现方法

 

 

本文主要关注的蓝色ORM部分。

 

Model:定义了实体的基类。每一张表都会生成对应的实体并继承此类;

 

ModelMapping:定义了一张表的结构信息,其中包含了表名、主键、字段类型等。每一张表都会生成一个;

 

ModelMappingReflector: 在程序第一次运行时,反射所有ModelMapping的子类,并将其加入一个字典集合中;

 

DataAccess<T>: 此类的作用时,根据实体和实体的结构信息(ModelMapping),自动生成SQL来访问数据库(Add,Update,Delete);或将数据库中值加到实体上(GetModel,GetList)。此类帮我们做CRUD的工作,我们不再需要写每张表基本的增删改查的工作了,但仍需要写复杂业务的查询。每一张表都会生成一个空的dao类并继承此类。

 

此ORM的核心类就是DataAccess<T>, 下面我们就拿Add作为示例:

 

Add 操作代码

 

复制代码
public int Add(T model)
{
    if (model == null)
    {
        throw new ArgumentNullException();
    }

    StringBuilder cmdText = new StringBuilder();
    cmdText.Append("INSERT INTO ").Append(modelMapping.TableName).Append(" (");
    cmdText.Append(string.Join(",", model.ColumnValues.Keys.ToArray()));
    cmdText.Append(") VALUES (@");
    cmdText.Append(string.Join(", @", model.ColumnValues.Keys.ToArray()));
    cmdText.Append(")");

    List<DbParameter> dbParms = new List<DbParameter>();
    foreach (var pair in model.ColumnValues) 
    {
        dbParms.Add(DBHelper.CreateInDbParameter(string.Format("@{0}",pair.Key), modelMapping.ColumnDict[pair.Key].DbDataBype, pair.Value));
    }

    return this.ExecuteNonQuery(CommandType.Text, cmdText.ToString(), dbParms.ToArray());
}
复制代码

 

 

 

当我们写这样的代码时User model=new User(); model.UserName时,实际上会向Model中ColumnValues集合中添加数据。而要生成一个INSERT SQL (INSERT INTO tablename (column1,colum2) VALUES (@column1,@column2)和添加插入参数,我们需要表名,列名,列值和列的类型。在列名和列值就存在于Model中的ColumnValues集合,而列的类型和表名,我们可以在ModelMapping中获取。

 

3   示例

 

 View Code

 

 

 

 

 

4  总结

 

这个版本的ORM示例,示例是没有认真去写了,因为不认为会有人用。但是这个ORM的代码是我认为比较简单的一个版本,只具有ORM的核心功能,几个类,只要具有c#基础的人都能看懂,有兴趣的可以看下。后续,自己会加上分页的Pager相关的内容、数据同步、数据验证的功能和和根据SQL自动生成实体对象的功能。

 

所有的源代码: BaseProject.7z

 

 

 

程序员必备网站

1 apue的详细介绍,包含了相关内容并且还有代码实现,一个后台程序员的宝典



 
2 介绍设计模式、反设计模式、重构以及UML ,里面包含了大量的实例代码,不急于搞懂,随着工作年限慢慢消化
 
 
 
3 C++ STL的各种接口介绍,并包含了各种接口详细使用的实例代码,对初入行者非常有用
 
 
 
4 国内优秀的博客
1)陈皓的博客,各种问题,干货多多
 
2)阿里巴巴优秀团队博客
 
 
5 美国友人的博客,美国大牛太多,学习学习人家是如何搞技术的
 

 
6 UML相关工具一览表,还包含了在线工具,如果只是使用一次,可以直接在线绘制UML
 
 
 
7 了解现在有那些好玩的应用,了解一下业界情况
 
 
 
8 网易公开课,看看天朝课程的差距,扩展一下视野
 
 
 
 
9 分布式系统经典论文翻译系列
 
转载请注明出处 jacksu 
开源文档:  redis源码解析 
开源库:  github链接 
个人小站:  jack's blog
posted on 2014-07-31 13:56  HackerVirus  阅读(209)  评论(0编辑  收藏  举报