在日常进行数据库操作的过程中,我的数据层使用的是微软企业库,但对于多字段的数据的插入与更新时写sql语句就会显得特别费时间,还会经常出现错误耗费时间排查,所以决定基于微软企业库封装一个轻量级的ORM框架(基于mysql),来简化数据库操作。

首先解决的问题就是实体类与数据库表的字段映射,这里使用的是反射,先上个代码

 public T ConvertDataToEntity<T>(DataRow row) where T:TModel{Dictionary<string, object> dic = new Dictionary<string, object>();DataColumnCollection columns = row.Table.Columns;//获取对象类型Type tp = typeof(T);//获取空构造函数ConstructorInfo ct = tp.GetConstructor(System.Type.EmptyTypes);//new 对象T entity = (T)ct.Invoke(null);//获取所有公有字段PropertyInfo[] infos = tp.GetProperties();//遍历字段进行查询结果的逐个赋值foreach (PropertyInfo info in infos){dic.Add(info.Name, null);if (columns.Contains(info.Name)){object fieldvalue = null;//判断查出的值是否为null,不为null才能反射赋值if (!Convert.IsDBNull(row[info.Name])){fieldvalue = row[info.Name];}else{fieldvalue = info.PropertyType.IsValueType ? Activator.CreateInstance(info.PropertyType) : null;}info.SetValue(entity, fieldvalue);if (dic.Keys.Contains(info.Name)){dic[info.Name] = fieldvalue;}entity.FieldValueMapper = dic;}}return entity;}

具体的步骤就是首先获取传入对象类型的Type,获取空的构造函数,调用构造函数new一个对象出来,获取实体类的所有字段和取数据库中的值进行字段匹配赋值,封装的方法中都是使用了泛型,是为了更好的通用性,传入什么对象,映射返回就是什么对象,强类型引用避免了强制转换装箱拆箱的过程。

关于数据库的操作是基于微软企业库的,都封装在了Command对象中,先来看下代码结构

  public class Command{public Database DB { set; get; }public string CommandText { set; get; }public List<Param> ParamDic { set; get; }public ORMEnum.OptionType CommandType { set; get; }public DbTransaction CommandTransition { set; get; }public MapperUtil Mapper { set; get; }public Command(){Mapper = new MapperUtil();}public void ExecuteCommand(){string strSql = (DB.DbProviderFactory.ToString() != "System.Data.OracleClient.OracleClientFactory") ?CommandText :CommandText;DbCommand cmd = DB.GetSqlStringCommand(strSql);if (null != ParamDic){foreach (Param param in ParamDic){DB.AddInParameter(cmd, param.ParamName, param.ParamType, param.ParamValue);}}DB.ExecuteNonQuery(cmd);if (null != CommandTransition){DB.ExecuteNonQuery(cmd, CommandTransition);}else{DB.ExecuteNonQuery(cmd);}}public List<T> QueryCommand<T>() where T : TModel{List<T> list = new List<T>();string strSql = (DB.DbProviderFactory.ToString() != "System.Data.OracleClient.OracleClientFactory") ?CommandText :CommandText;DbCommand cmd = DB.GetSqlStringCommand(strSql);if (null != ParamDic){foreach (Param param in ParamDic){DB.AddInParameter(cmd, param.ParamName, param.ParamType, param.ParamValue);}}DataView result = DB.ExecuteDataView(cmd);foreach (DataRow row in result.Table.Rows){T entity = Mapper.ConvertDataToEntity<T>(row);list.Add(entity);}return list;}

里面封装了两个比较常用类型的方法,一个是执行数据库操作,例如插入和更新等,一个是查询操作,用来返回映射后的数据对象List。初始化Command对象的工作封装在了BaseCommand类中,返回一个Command对象,再执行Comadn对象的Execute的方法,主要是为了封装事物的执行,耦合度太高会影响后续扩展,下面来看下ORM框架事物是如何实现的。

1.在Command中已经可以看到定义了Transition对象,会根据对象属性判断是否执行事物

2.在对外访问的类DBUtil中我们会封装一个Transition对象,在执行所有方法时会判断这个事物对象是否为空,不为空复制给Command对象的事物成员对象

3.ExecuteTransition方法以Deletegate委托的形式接收用户的操作,并对事物对象初始化,所有的操作就会关联同一个事物

看下ExecuteTransition的代码与用法

 public void ExecuteTransition(TransitionHandler handler, out string exceptionStr){exceptionStr = string.Empty;using (DbConnection connection = db.CreateConnection()){connection.Open();transaction = connection.BeginTransaction();try{handler.Invoke();transaction.Commit();}catch (Exception e){exceptionStr = e.Message + e.StackTrace;transaction.Rollback();throw e;}finally{connection.Close();transaction = null;}}}

最后说一下对实体类的定义,非常简单,只要和数据库表一致就可以,另外给主键标志为自定义的Attribute,从而可以智能的实现主键查找与删除方法的实现

 public class frame_user:TModel{[Key]public string userguid { set; get; }public string loginid { set; get; }public string displayname { set; get; }public string password { set; get; }}

注:框架中还封装了一些常用方法,例如简单的分页查找,批量插入,根据主键查找,直接执行sql,其中事物同时支持sql与ORM操作的混合使用,希望大家多多提意见与交流,我可以进一步完善这个框架,感谢!

更新:最近FastORM加入弱引用类型的简单增删改查对象,对反射使用表达式树优化选项,加入支持lamda表达式的泛型查找方法,框架的具体使用说明已在项目ReadMe中添加

项目地址:FastORM: 基于ado.net封装的轻量ORM框架

c#自己封装一个轻量级ORM框架FastORM相关推荐

  1. 重磅开源:基于.NET 6.0 自研轻量级ORM框架

    Fast Framework 项目:https://gitee.com/China-Mr-zhong/Fast.Framework 一.前言 1.为了实现快速开发,省去编写大量Sql时间,更好的面向对 ...

  2. c# 轻量级ORM框架 实现(一)

    c# 轻量级ORM框架 实现(一) 2018年09月04日 14:11:02 IT哈 阅读数:1245 发布一个自己写的一个轻量级ORM框架,本框架设计期初基于三层架构.所以从命名上来看,了解三层的朋 ...

  3. .NET轻量级ORM框架Dapper入门精通

    一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...

  4. java 轻量级 job_oxygen: 一个轻量级Java框架,包含ioc、aop、config、cache、job、Jdbc、web等...

    oxygen 轻量级Java框架 介绍 一个轻量级Java框架 oxygen-core 配置管理,支持${attrs.key:defaultValue}表达式获取配置 加解密管理,提供加解密服务内置基 ...

  5. dapperpoco mysql_Dapper一个和petapoco差不多的轻量级ORM框架

    我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dapper,而且被称为th ...

  6. 轻量级ORM框架 Bankinate

    [前言] 前面讲过ORM的前世今生,对ORM框架不了解的朋友可以参考博文:https://www.cnblogs.com/7tiny/p/9551754.html 今天,我们主要通过设计一款轻量级的O ...

  7. 自己动手写一个Golang ORM框架

    作者:smallyang,腾讯 IEG 运营开发工程师 当我深入的学习和了解了 GORM,XORM 后,我还是觉得它们不够简洁和优雅,有些笨重,有很大的学习成本.本着学习和探索的目的,于是我自己实现了 ...

  8. Python的轻量级ORM框架peewee

    作者:小小明 在前面的<改变python对象的黑魔法metaclass>一文中,我介绍了使用metaclass自己编写ORM框架的思路. 地址:https://blog.csdn.net/ ...

  9. 简单分享一个轻量级自动化测试框架目录结构设计

    更多关于python selenium的文章,请关注我的专栏:Python Selenium自动化测试详解 很多人在做自动化测试的过程中会遇到一个瓶颈,就是能够写脚本,但是不知道怎么去组织代码,怎么搭 ...

最新文章

  1. 程序员必备技能:如何画好架构图?
  2. python 脚本_python脚本如何同时运行多个
  3. ORACLE百万记录SQL语句优化技巧
  4. 数论初步——同余与模算术
  5. 解决Jenkins邮件配置问题
  6. MyBatis 实际使用案例-typeHandlers【重点】
  7. 深度学习、机器学习与NLP的前世今生
  8. jmeter重写java请求_jmeter之编写java请求-扩展Java Sampler
  9. 第六章 线性回归 学习笔记中
  10. Atitit 数据库对比较 oracle mysql pgsql 目录 1.1. 跨机器跨库mysql vs pgsql 1 1.2. 动态增加列 pgzhichi 1 1.3. Cte 1 1.4
  11. SQL 经典50题(题目+解答)(1)
  12. RK3399外设驱动之RTC驱动(一)
  13. 中国.NET:各地微软技术俱乐部汇总(更新中...)
  14. 东南大学计算机学院保研比例,江苏省高校保研率排行榜,南京大学第1,保研率超过1/3...
  15. linux中的ul命令,Linux ngrep 命令用法详解-Linux命令大全(手册)
  16. Python Pandas缺省值(NaN)处理
  17. RGB颜色转换16进制
  18. 尝试从redis未授权访问到getshell的四种姿势(失败)
  19. 网上商城SSH三者间的牵线
  20. 1005--HBase操作实战(HBase Shell命令行模式)

热门文章

  1. 黑马程序员C++ 第三阶段 提高篇(1)
  2. 查全率与查准率的计算方法
  3. 网站备案所需准备材料
  4. 场波知识整理——3.1几种介质中的传播规律
  5. 蓝桥杯练习【STL训练】——周瑜的反间计
  6. 一条sql查询多个表的统计数据
  7. PHP7语言基础——Cookie与Session
  8. 如果看了此文你还不懂傅里叶变换,那就过来掐死我吧
  9. 用定时器实现色块颜色渐变/色块切换效果(HTML+CSS+JS)
  10. 关于电脑开(WIFI、蓝牙)热点其他设备无法连接的问题