C#基础系列:实现自己的ORM(ORM的基础概念)

ORM(O/R Mappping对象关系映射)的基础概念

在我们的系统中,存 在大量的需要进行持久化存储的对象,这些对象可能是各种各样的业务单据,也 可能是我们的系统配置信息等。另外一些属于内存中使用而不需要进行持久化存 储的对象,不属于我们的讨论范围。而在支持对象序列化的语言比如C#,Java中 ,我们可以将这些对象序列化到磁盘文件或者直接保存到关系数据库中。其中关 系数据库是我们最主要也是最安全的选择。

在对数据库中的业务数据进 行各种操作的时候我们发现,我们进行的大量的Insert、Update、Delete操作, 除了其SQL语句根据不同的对象有不同的变换之外,其主要流程存在很多相似之 处。于是人们就想通过一个东西来实现这些相同部分的操作的自动化,而那些不 同的流程,操作再做特殊处理。这样我们就可以把主要的精力都集中在那些个性 化的,特殊的流程操作上。这就是ORM产生的根本原因。

在Java的世界里 ,ORM框架的应用比较早,也比较成熟,比如Hibernate等,而在.NET世界里,起 步就相对晚的多。但是由于担心使用开源的ORM框架导致项目更为复杂(因为这 些开源工具虽然很好,但是各个项目总是存在自己特殊的地方。所以目前不敢用 )。但是我们确可以自己设计开发些小型的,尽量符合自己项目的ORM。

可是不论怎么样,我们都需要对ORM有一定的了解:

一、对象的继承结构 :

在支持OO的语言中,继承是最重要的概念之一,所以我们的ORM也应该 对继承作出相应的支持。一般来说,对于ORM世界中的继承有三种模式:

1、一个继承树映射到一个表(ONE_INHERITANCE_TREE_ONE_TABLE):

即将具有相同父类的所有类都映射到一个表中,这些类属性映射的并集 组成了这个表的所有列,在这种情况下,只需要对最底层的类进行映射。如下面 一个类结构:

在上面的类结构中,父类有属性Property1和Property2,而子类 Child1有属性Property3,子类Child2有属性Property4。

所以如果采用 ONE_INHERITANCE_TREE_ONE_TABLE映射模式的话,数据库中只有一张表。

类属性 数据库表字段
Property1 Field1
Property2< /td> Field2
Property3 Field3
Property4 Field4

但是这种模式存在大量 的属于冗余,对于Child1,由于没有Property4属性,所以字段Field4是冗余字 段。同样,对于Child2,Field3是冗余字段。但是这种模式的优点的简单。

时间: 2024-09-05 08:35:50

C#基础系列:实现自己的ORM(ORM的基础概念)的相关文章

C#基础系列:实现自己的ORM(构造我自己的ORM)

构造我自己的ORM 通过前面两章的描述,我相信很多朋友都已经明白 我了下面将要讨论到的ORM的实现方法了,那就是根据自定义Attribute来定义 O/R Mapping规则,然后通过反射来动态获取此规则,动态构造SQL语句. 由于这个小东西(ORM)出生在深圳,所以我想来想去,她应该有个深圳 的名字,所以我就叫她"MiniORM".不知道各位认为如何? MiniORM采用的是ONE_INHERIT_TREE_ONE_CLASS(一个继承树对应于一个 表)的结构,虽然这种结构容易导致数

C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)

一. 反射 什么是反射? 简单点吧,反射就是在运行时动态获 取对象信息的方法,比如运行时知道对象有哪些属性,方法,委托等等等等. 反射有什么用呢? 反射不但让你在运行是获取对象的信息,还提 供运行时动态调用对象方法以及动态设置.获取属性等的能力. 反射在 ORM中有什么用呢? 我这里所讨论的ORM实现是通过自定义Attribute的方 式进行映射规则的描述的.但是我们并不知道具体哪个对象需要对应哪个表,并 且这些对象是独立于我们的ORM框架的,所以我们只能通过自定义Attribute来定 义映射

C#基础系列:实现自己的ORM(MiniORM的测试代码)

看到有同学反馈,说MiniORM代码有Bug,也不知道怎么用,所以今天我就写了些测试代码.希望能够给点帮助. 同时也发现了两Bug,一并罗列出: 1.MiniORM.PubFuncs.GetObjectType()函数: 1.public static Type GetObjectType(string assemblyname, string namespacename, string classname)2.{3. Type objType = (Type)_HashObjectType[a

“数据结构基础”系列网络课程主页

前言 自从下决心要解决学生动手能力差的问题,开始了课程实践资源的建设之旅:自迷上了翻转课堂,所教课程的视频,也就逐渐形成了体系.在为我自己的校内学生服务的同时,也希望能够让更多人有机会用到. 自全身心投入教学,收入.奖金的渠道也便收缩到了极致.接受CSDN学院商业运作的规则,将课程投放此处,一则创收一些,弥补付出数倍精力建设资源而只能喝大锅饭中稀粥中的不平衡,二则因免费带来的不珍惜也让自己有些不快.课程定价大概等值于一张景区门票,或者一块生日蛋糕,愿者自行决定. 为天下IT学子服务的诺言不变,为

JS基础系列之正则表达式_正则表达式

正则表达式是一个很牛逼的东东,今天在这里只是简单的给刚刚接触JS的人普及一下,里面若有争议的地方欢迎大家留言! 1.1 什么是正则表达式 ​ 正则表达式(regular expression)是一个描述字符模式的对象,ECMAScript的RegExp 类表示正则表达式,而String和RegExp都定义了使用正则表达式进行强大的模式匹配和文本检索与替换的函数. ​ 正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具. 1.2 正则表达式的作用 ​ 正则表达式主要用来验证

Entity Framework 5.0基础系列

原文:Entity Framework 5.0基础系列 1.Entity Framework简介 http://www.cnblogs.com/aehyok/p/3315991.html 2.Entity Framework DBFirst尝试http://www.cnblogs.com/aehyok/p/3318892.html 3.Entity Framework ModelFirst尝试http://www.cnblogs.com/aehyok/p/3323438.html 4.Entit

网赚基础系列(三)网赚到底赚哪些人的钱?

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 网络创业与赚钱分不开,否则没有人会在网络创业. 关于到底赚哪些人的钱这个问题,我们一一分析. 1,国内外联盟. 谈到联盟,就涉及到了三方.广告主.联盟商.网站主.在这三方之间运作. 广告主提供产品等广告--去联盟商申请推广--网站主也就是站长去联盟平台申请广告代码挂在自己的站里或博客里.三方均按照点击.注册或销售付费. 以点击举个例子:比如我

JS基础系列之正则表达式

正则表达式是一个很牛逼的东东,今天在这里只是简单的给刚刚接触JS的人普及一下,里面若有争议的地方欢迎大家留言! 1.1 什么是正则表达式 ​ 正则表达式(regular expression)是一个描述字符模式的对象,ECMAScript的RegExp 类表示正则表达式,而String和RegExp都定义了使用正则表达式进行强大的模式匹配和文本检索与替换的函数. ​ 正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具. 1.2 正则表达式的作用 ​ 正则表达式主要用来验证

SQL Server-字字珠玑,一纸详文,完全理解SERIALIZABLE最高隔离级别(基础系列收尾篇)

前言 对于上述锁其实是一个老生常谈的话题了,但是我们是否能够很明确的知道在什么情况下会存在上述各种锁类型呢,本节作为SQL Server系列末篇我们 来详细讲解下. Range-Lock 上述关于RangeS-U.RangeS-S.RnageX-X以及还有RangeI-N这四种锁属于范围锁(Range-Lock)范畴.那么在什么情况下会存在范围锁呢,当在SERIALIZABLE最高隔离级别时范围锁将会被用到,这也就意味着直到事务开启到结束查询出的结果集是一致的以此来防止幻影.在该隔离级别中锁定的