在开发ORM之前,先简单的介绍下ORM的基本概念。

对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外 一种形式。

产生渊源
你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。看看DAL代码,你肯定会看到很多近似的通用的模式。人们就想了,能不能自动化实现DAL呢,其实大部分是可以的,所以ORM的各种工具诞生了,他们会自动为你生成dal的代码。

目前.net平台下比较流行的 ORM 产品有NHibernate,Entity Framework等。
相对于NHibernate这些重量级的ORM产品,对数据库的一张表做关系映射,就必须为其建立一张hbm.xml的映射文件,显得有些繁琐。c#支持自定义特性,对于数据库字段的一些属性关系映射,我们可以通过在Model类(数据库结构关系映射类)的属性上标注自定义特性来抽象描述数据库相关字段。

目标效果预览

数据库表结构:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model.Entities;
using System.Data;
namespace Model
{
[Serializable]
public class EmpInfoModel : BaseEntity
{
/// <summary>是否可以修改
/// </summary>
public const bool isCanMod = false;
/// <summary>tableName
/// </summary>
public const String TableName = "EmpInfo";
public EmpInfoModel()
{ } private string _Id;
private string _Name;
private int? _isAllMoneyCheck;
private Guid? _MyGuid;
private Int16? _MySmallint;
private bool? _MyBool;
private string _Myntext;
[DBField(KeyType = DbKeyType.PK)]
[DBType(SqlDBType=SqlDbType.NVarChar)]
public virtual string Id
{
set { _Id = value; }
get { return _Id; }
} public string Name
{
set { _Name = value; }
get { return _Name; }
} public int? isAllMoneyCheck
{
set { _isAllMoneyCheck = value; }
get { return _isAllMoneyCheck; }
} [DBType(SqlDBType = SqlDbType.UniqueIdentifier)]
public Guid? MyGuid
{
set { _MyGuid = value; }
get { return _MyGuid; }
} [DBType(SqlDBType = SqlDbType.SmallInt)]
public Int16? MySmallint
{
set { _MySmallint = value; }
get { return _MySmallint; }
} [DBType(SqlDBType = SqlDbType.Bit)]
public bool? MyBool
{
set { _MyBool = value; }
get { return _MyBool; }
}
[DBType(SqlDBType = SqlDbType.NText)]
public string Myntext
{
set { _Myntext = value; }
get { return _Myntext; }
}
}
}

Model层

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model.Entities;
using Model;
using DAL.ErpSqlDAL.SqlFactory;
using DAL.ErpSqlDAL.SqlFactory.Common;
namespace DAL.Data
{
public class EmpInfoDAL : BaseDAL<EmpInfoModel>
{
public EmpInfoDAL(DbCmd dbCmd)
: base(dbCmd, EmpInfoModel.TableName)
{ } public IList<EmpInfoModel> getTopOneList()
{
return base.GetEntityBySql("select * from EmpInfo where id=1", null);
}
}
}

DAL层

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model.Entities;
namespace DAL.ErpSqlDAL.SqlFactory
{
public class BaseDAL<T> : OperateEntity<T>
where T : BaseEntity
{
private string entityName; public BaseDAL(DbCmd dbCmd, string entityName)
: base(dbCmd, entityName, typeof(T))
{
this.dbCmd = dbCmd;
this.entityName = entityName;
} /// <summary>得到一个实体的内容
/// </summary>
/// <param name="conditionList">条件实体</param>
/// <returns></returns>
public virtual T GetOneEntity(T conditionList)
{
try
{
IList<T> entityList = base.GetEntity(conditionList);
if (entityList.Count > )
return entityList[];
return null;
}
catch
{
throw;
}
}
/// <summary>添加实体
/// </summary>
/// <param name="entity">要添加的实体</param>
/// <returns></returns>
public virtual object AddEntity(T entity)
{
try
{
IList<T> entityList = new List<T>();
entityList.Add(entity); return base.AddEntity(entityList);
}
catch
{
throw;
} } /// <summary>根据主键修改实体
/// </summary>
/// <param name="entity">要修改的内容和包含主键值的实体</param>
/// <returns></returns>
public virtual int ModEntity(T entity)
{
try
{
IList<T> entityList = new List<T>();
entityList.Add(entity); return base.ModEntity(entityList);
}
catch
{
throw;
}
}
/// <summary>修改实体
/// </summary>
/// <param name="sourceEntity">要修改的内容</param>
/// <param name="conditionEntity">修改的条件</param>
/// <returns></returns>
public virtual int ModEntity(T sourceEntity, T conditionEntity)
{
try
{
IList<T> SourceEntityList = new List<T>();
SourceEntityList.Add(sourceEntity); IList<T> conditionEntityList = new List<T>();
conditionEntityList.Add(conditionEntity); return base.ModEntity(SourceEntityList, conditionEntityList);
}
catch
{
throw;
}
} /// <summary>删除实体
/// </summary>
/// <param name="entity">删除的条件</param>
/// <returns></returns>
public virtual int DelEntity(T entity)
{
try
{
IList<T> SourceEntityList = new List<T>();
SourceEntityList.Add(entity); return base.DelEntity(SourceEntityList);
}
catch
{
throw;
}
}
}
}

DAL层基类BaseDAL

使用:

   public partial class Test : System.Web.UI.Page
{
public string connetionString = "server=.;initial catalog=test;UID=sa;PWD=sa123";
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindData(); }
} protected void BindData()
{
DbCmd dbCmd = new DbCmdFactory(connetionString).CreateDbCmd();
IList<EmpInfoModel> list = new EmpInfoDAL(dbCmd).GetEntity(null);
GridView1.DataSource = list;
GridView1.DataBind();
} protected void Button1_Click(object sender, EventArgs e)
{
DbCmd dbCmd = new DbCmdFactory(connetionString).CreateDbCmd(); EmpInfoModel model = new EmpInfoModel();
model.Id = (GridView1.Rows.Count + ).ToString();
model.Name = "name" + model.Id+@"@!#$%^&*()_+-=<>:""{}|\';/.,";
model.isAllMoneyCheck = ;
model.MyGuid = Guid.NewGuid();
model.MySmallint = ;
model.MyBool = true;
model.Myntext = "Myntext " + model.Id;
new EmpInfoDAL(dbCmd).AddEntity(model);
BindData();
} protected void Button2_Click(object sender, EventArgs e)
{
DbCmd dbCmd = new DbCmdFactory(connetionString).CreateDbCmd();
EmpInfoModel model = new EmpInfoModel();
model.Id = ("").ToString(); model.isAllMoneyCheck = ;
model.MyGuid = Guid.NewGuid();
model.MySmallint = ;
model.MyBool = true;
new EmpInfoDAL(dbCmd).DelEntity(model);
BindData();
} protected void Button3_Click(object sender, EventArgs e)
{
DbCmd dbCmd = new DbCmdFactory(connetionString).CreateDbCmd();
IList<EmpInfoModel> list = new EmpInfoDAL(dbCmd).getTopOneList();
GridView1.DataSource = list;
GridView1.DataBind();
}
}

test.aspx.cs

通过对Model类属性做自定义特性来映射,数据库字段和程序类型的对应关系,是否为主键,是否外键,是否为虚拟字段等。

在下一篇中将开始研究如何一步一步的构建一个ORM框架。

自己开发轻量级ORM(二)

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

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

    上一篇简单的对轻量级ORM开发开了个头.这篇主要聊下ORM框架的设计思路. ORM本质上是对数据库操作的抽象.大体上我将其分为对数据结构的抽象和对执行方法的抽象. 我的ORM设计图: 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. .NET轻量级ORM框架Dapper入门精通

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

  5. 轻量级ORM——PetaPoco

    近乎产品的数据访问是基于轻量级ORM——PetaPoco,哪怕是最新的5.2版本也是基于PetaPoco. 产品源码下载地址:http://www.jinhusns.com/Products/Down ...

  6. 轻量级ORM工具Simple.Data

    今天推举的这篇文章,本意不是要推举文章的内容,而是据此介绍一下Simple.Data这个很有意思的类ORM工具. 现在大家在.NET开发中如果需要进行数据访问,那么基本都会使用一些ORM工具,比如微软 ...

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

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

  8. 连表查询都用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%我不知道在 ...

  9. 分享自己写的基于Dapper的轻量级ORM框架~

    1.说明 本项目是一个使用.NET Standard 2.0开发的,基于 Dapper 的轻量级 ORM 框架,包含基本的CRUD以及根据表达式进行一些操作的方法,目前只针对单表,不包含多表连接操作. ...

随机推荐

  1. Delphi 悬浮窗口、浮动窗口的实现

    源:Delphi 悬浮窗口.浮动窗口的实现 浮动窗体的实现 http://blog.tianya.cn/blogger/post_show.asp?BlogID=68097&PostID=80 ...

  2. 【bzoj1552】[Cerc2007]robotic sort

    题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开的 ...

  3. 8、手把手教你Extjs5(八)自定义菜单2

    这一节来定义另外三种类型的菜单类.首先定义菜单按钮类.文件放于app/view/main/region目录下面,文件名为ButtonMainMenu.js. /** * 显示在顶部的按钮菜单,可以切换 ...

  4. linux命令学习5-pssh命令

    pssh命令是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似pdsh,个人认为相对pdsh更为简便,使用必须在各个服务器上配置好密钥认证访问. 1. ...

  5. Android之Margin和Padding属性及支持的长度单位

    做了个小软件后,终于把Margin和Padding弄清楚了,现总结如下: Android的Margin和Padding跟Html的是一样的.如下图所示:黄色部分为Padding,灰色部分为Margin ...

  6. 《算法导论》习题2.3-6 改进的InsertSort

    InsertSort中有关键的一步是把当前元素A[i]插入到已经排好序的A[1,i-1]的合适的位置上,在原始的InsertSort算法中, 采用的是从后往前一步一步查找的方法,习题2.3-6要求利用 ...

  7. vi的基本操作

    vi的基本操作 a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command m ...

  8. Cookie 简单使用记录浏览记录

    ItemsDAO.java package dao; import java.util.* ; import java.sql.* ; import util.DBHelper; import ent ...

  9. iOS 界面 之 EALayout 无需反复编译,可视化实时界面,告别Storyboard AutoLayout Xib等等烦人的工具

    http://blog.csdn.net/fatherhui iOS开发,EALayout 无需反复编译,可视化实时界面,告别Storyboard AutoLayout Xib等等烦人的工具 EALa ...

  10. Chrome Timeline的指标说明:Blocked、Connect、Send、Wait、Receive

    Blocked time includes any pre-processing time (such as cache lookup) and the time spent waiting for ...