上一篇简单的对轻量级ORM开发开了个头。这篇主要聊下ORM框架的设计思路。

ORM本质上是对数据库操作的抽象。大体上我将其分为对数据结构的抽象和对执行方法的抽象。

我的ORM设计图:

ORM框架需要完成.net数据和数据库中数据的相互转换,以及对SQL语句中经典的增删改查操作的抽象封装。

封装方法代码:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Common;
using Model.Entities; namespace DAL.ErpSqlDAL.SqlFactory
{
/// <summary>CRUD方法抽象
/// 创建人:雷旭鹏(leo) 2014-1-13
/// 联系方式:leixupeng823@163.com
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class OperateEntity<T>:ResolveEntity<T> where T :BaseEntity
{
public OperateEntity(DbCmd dbCmd, string entityName, Type entityType)
: base(dbCmd, entityName, entityType)
{
} /// <summary>添加实体
/// </summary>
/// <param name="entityList">要添加的内容</param>
/// <returns></returns>
public virtual object AddEntity(IList<T> entityList)
{
try
{
base.SourceEntity = entityList;
base.ConditionEntity = null;
base.OperateType = OperateType.INSERT;
base.EntityToSql(); string strSql = base.CommandString; return DBHelper.ExecuteScalar(dbCmd.Cmd, CommandType.Text, strSql, base.Parameters.ToArray());
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>修改实体,要修改的内容和条件一一对应
/// </summary>
/// <param name="entityList">要修改的内容</param>
/// <param name="conditionList">条件</param>
/// <returns></returns>
public virtual int ModEntity(IList<T> entityList, IList<T> conditionList)
{
try
{
base.SourceEntity = entityList;
base.ConditionEntity = conditionList;
base.OperateType = OperateType.UPDATE; base.EntityToSql();
string strSql = base.CommandString;
return DBHelper.ExecuteNonQuery(dbCmd.Cmd, CommandType.Text, strSql, base.Parameters.ToArray());
}
catch
{
throw;
}
}
/// <summary>根据主键修改实体
/// </summary>
/// <param name="entityList">要修改的内容和包含主键值的实体</param>
/// <returns></returns>
public virtual int ModEntity(IList<T> entityList)
{
try
{
IList<T> cndEntity = new List<T>();
CreatePKConditionFromSourceEntity(entityList, cndEntity);
return ModEntity(entityList, cndEntity);
}
catch
{
throw;
}
}
/// <summary>删除实体
/// </summary>
/// <param name="conditionList">删除的条件</param>
/// <returns></returns>
public virtual int DelEntity(IList<T> conditionList)
{
try
{
base.SourceEntity = conditionList;
base.ConditionEntity = conditionList;
base.OperateType = OperateType.DELETE; base.EntityToSql();
string strSql = base.CommandString;
return DBHelper.ExecuteNonQuery(dbCmd.Cmd, CommandType.Text, strSql, base.Parameters.ToArray());
}
catch
{
throw;
}
}
/// <summary>得到实体
/// </summary>
/// <param name="condition">查询条件</param>
/// <returns></returns>
public virtual IList<T> GetEntity(T condition)
{
try
{
if (condition != null)
{
IList<T> coditionLists = new List<T>();
coditionLists.Add(condition); base.ConditionEntity = coditionLists;
base.SourceEntity = coditionLists;
}
base.OperateType = OperateType.SELECT; base.EntityToSql();
string strSql = base.CommandString;
return base.DateSetToEntity(DBHelper.GetDataSet(dbCmd.Adapter, dbCmd.Cmd, CommandType.Text, strSql, base.Parameters.ToArray()));
}
catch
{
throw;
}
}
/// <summary>得到一个值
/// </summary>
/// <param name="conditionList">查询条件</param>
/// <returns></returns>
public virtual Object GetValue(T conditionList)
{
try
{
IList<T> coditionLists = new List<T>();
coditionLists.Add(conditionList); base.SourceEntity = coditionLists;
base.ConditionEntity = coditionLists;
base.OperateType = OperateType.SELECT; base.EntityToSql();
string strSql = base.CommandString;
return DBHelper.ExecuteScalar(dbCmd.Cmd, CommandType.Text, strSql, base.Parameters.ToArray());
}
catch
{
throw;
}
} //exce by sql
/// <summary>执行存储过程得到一个值
/// </summary>
/// <param name="sqlStr">存储过程的名称</param>
/// <param name="Parameters">参数</param>
/// <returns></returns>
protected virtual Object GetValueByProc(string sqlStr, params DbParameter[] Parameters)
{
try
{
return DBHelper.ExecuteScalar(dbCmd.Cmd, CommandType.StoredProcedure, sqlStr, Parameters);
}
catch
{
throw;
}
}
/// <summary>执行SQL语句得到一个值
/// </summary>
/// <param name="sqlStr">SQL语句</param>
/// <param name="Parameters">参数</param>
/// <returns></returns>
protected virtual Object GetValueBySql(string sqlStr, params DbParameter[] Parameters)
{
try
{
return DBHelper.ExecuteScalar(dbCmd.Cmd, CommandType.Text, sqlStr, Parameters);
}
catch
{
throw;
}
}
/// <summary>执行SQL,返回受影响的函数
/// </summary>
/// <param name="sqlStr">存储过程的名称</param>
/// <param name="Parameters">参数</param>
/// <returns></returns>
protected virtual int ExecuteSql(string sqlStr, params DbParameter[] Parameters)
{
try
{
return DBHelper.ExecuteNonQuery(dbCmd.Cmd, CommandType.Text, sqlStr, Parameters);
}
catch
{
throw;
}
}
/// <summary>执行存储过程,返回受影响的函数
/// </summary>
/// <param name="sqlStr">存储过程的名称</param>
/// <param name="Parameters">参数</param>
/// <returns></returns>
protected virtual int ExecuteProc(string sqlStr, params DbParameter[] Parameters)
{
try
{
return DBHelper.ExecuteNonQuery(dbCmd.Cmd, CommandType.StoredProcedure, sqlStr, Parameters);
}
catch
{
throw;
}
} /// <summary>通过SQL语句得到实体
/// </summary>
/// <param name="sqlStr">SQL</param>
/// <returns></returns>
protected virtual IList<T> GetEntityBySql(string sqlStr)
{
try
{
return base.DateSetToEntity(DBHelper.GetDataSet(dbCmd.Adapter, dbCmd.Cmd, CommandType.Text, sqlStr, null));
}
catch
{
throw;
}
}
/// <summary>通过SQL语句得到DataSet
/// </summary>
/// <param name="sqlStr">SQL</param>
/// <returns></returns>
protected virtual DataSet GetDataSetBySql(string sqlStr)
{
try
{
return DBHelper.GetDataSet(dbCmd.Adapter, dbCmd.Cmd, CommandType.Text, sqlStr, null);
}
catch
{
throw;
}
}
/// <summary>通过SQL语句得到实体
/// </summary>
/// <param name="sqlStr">SQL</param>
/// <param name="Parameters">参数</param>
/// <returns></returns>
protected virtual IList<T> GetEntityBySql(string sqlStr, params DbParameter[] Parameters)
{
try
{
return base.DateSetToEntity(DBHelper.GetDataSet(dbCmd.Adapter, dbCmd.Cmd, CommandType.Text, sqlStr, Parameters));
}
catch
{
throw;
}
}
/// <summary>通过存储过程,语句得到实体
/// </summary>
/// <param name="sqlStr">SQL</param>
/// <param name="Parameters">参数</param>
/// <returns></returns>
protected virtual IList<T> GetEntityByProc(string sqlStr, params DbParameter[] Parameters)
{
try
{
return base.DateSetToEntity(DBHelper.GetDataSet(dbCmd.Adapter, dbCmd.Cmd, CommandType.StoredProcedure, sqlStr, Parameters));
}
catch
{
throw;
}
}
}
}

下一篇将讲下从代码上如何实现上面的设计图。

自己开发轻量级ORM(二)的更多相关文章

  1. 自己开发轻量级ORM(一)

    在开发ORM之前,先简单的介绍下ORM的基本概念. 对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的 ...

  2. 自己开发轻量级ORM(三)

    上一篇中简单分享了下ORM的设计思路.现在开始讲如何用代码来实现上篇的设计模型. 我们建2个类库来分别抽象数据库表结构关系映射和SQL增删改查操作. 打开VS2010,新建2个类库.分别起名为Mode ...

  3. 轻量级ORM框架 QX_Frame.Bantina(二、框架使用方式介绍)

    轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...

  4. 轻量级ORM框架 QX_Frame.Bantina(一、框架简介)

    轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...

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

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

  6. .NET轻量级ORM组件Dapper葵花宝典

    一.摘要 为什么取名叫<葵花宝典>? 从行走江湖的世界角度来讲您可以理解为一本"武功秘籍",站在我们IT编程的世界角度应该叫"开发宝典". 如果您在 ...

  7. 连表查询都用Left Join吧 以Windows服务方式运行.NET Core程序 HTTP和HTTPS的区别 ASP.NET SignalR介绍 asp.net—WebApi跨域 asp.net—自定义轻量级ORM C#之23中设计模式

    连表查询都用Left Join吧   最近看同事的代码,SQL连表查询的时候很多时候用的是Inner Join,而我觉得对我们的业务而言,99.9%都应该使用Left Join(还有0.1%我不知道在 ...

  8. Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 下一篇:Farseer.net轻量级ORM开源框 ...

  9. [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)

    [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date  周六 10 一月 2015 By 钟谢伟 Category website develop ...

随机推荐

  1. php CI 实战教程:如何去掉index.php目录

    Windows下自由创建.htaccess文件的N种方法 .htaccess是apache的访问控制文件,apache中httpd.conf的选项配合此文件,完美实现了目录.站点的访问控制,当然最多的 ...

  2. Linux下hosts、host.conf、resolv.conf

    /etc/resolv.conf 该文件是DNS域名解析的配置文件,它的格式很简单,每行以一个关键字开头,后接配置参数. resolv.conf的关键字主要有四个,分别是: nameserver   ...

  3. Big Data架构师技能图谱

    大数据通用处理平台 Spark Flink Hadoop 分布式存储 HDFS 资源调度 Yarn Mesos 机器学习工具 Mahout Spark Mlib TensorFlow (Google ...

  4. 基于Keepalvied的Mysql主主漂移(切换)

    Keepalived实现原理:Keepalived详细介绍简介 实验环境 Master1.Amoeba--IP:192.168.1.5 Master2---IP:192.168.1.10 同时安装ke ...

  5. (简单) POJ 1860 Currency Exchange,SPFA判圈。

    Description Several currency exchange points are working in our city. Let us suppose that each point ...

  6. java之常用正则表达式

    http://www.cnblogs.com/helloczh/articles/1648029.html http://wenku.baidu.com/link?url=gLcsovVfQqRTVa ...

  7. ubuntu升级php版本

    如果安装的 PHP 版本过低的话,可以通过下面的指令来升级: sudo add-apt-repository ppa:ondrej/php5   sudo apt-get update   sudo  ...

  8. C++中string类的使用方法

    如果所比较的两个string 相等,则返回0: 操作string 大于参数string,返回 正数:操作string 小于参数string,返回负数. (1) 比较操作string 与 _Str 或C ...

  9. IOS开发-OC学习-Foundation框架练习

    OC语言Foundation框架中字典.字符串.数组的应用: NSString *string = @"China|Usa|France"; NSArray *array = [s ...

  10. 更改Windows Live Writer默认日志与草稿保存路径

    目的:把保存Windows Live Writer的日志与草稿文件夹My Weblog Posts移动到E:\Blog\路径下 用mklink命令,创建E:\Blog\路径下的My Weblog Po ...