大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C#技巧 > 一个ORM的实现(附源代码)

一个ORM的实现(附源代码)(1)

关键词:源代码ORM  阅读(1124) 赞(15)

[摘要]本文是对一个ORM的实现(附源代码)的讲解,对学习C#编程技术有所帮助,与大家分享。

1  前言

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

已经有很多的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中获取。

«上一页12下一页»


相关评论