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):
即将具有相同父类的所有类都映射到一个表中,这些类属性映射的并集组成了这个表的所有列,在这种情况下,只需要对最底层的类进行映射。如下面一个类结构:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 233.25pt; HEIGHT: 169.5pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.wmz"></imagedata></shape>
在上面的类结构中,父类有属性Property1和Property2,而子类Child1有属性Property3,子类Child2有属性Property4。
所以如果采用ONE_INHERITANCE_TREE_ONE_TABLE映射模式的话,数据库中只有一张表。
类属性
|
数据库表字段
|
Property1
|
Field1
|
Property2
|
Field2
|
Property3
|
Field3
|
Property4
|
Field4
|
但是这种模式存在大量的属于冗余,对于Child1,由于没有Property4属性,所以字段Field4是冗余字段。同样,对于Child2,Field3是冗余字段。但是这种模式的优点的简单。
2、一个继承路径映射到一个表(ONE_INHERITANCE_PATH_ONE_TABLE):
同样一上面的类结构,数据库中将存在两张表,分别对应于Child1和Child2.
Child1对应的数据库表:
类属性
|
数据库表字段
|
Property1
|
Field1
|
Property2
|
Field2
|
Property3
|
Field3
|
Child2对应的数据库表
类属性
|
数据库表字段
|
Property1
|
Field1
|
Property2
|
Field2
|
Property4
|
Field4
|
这种模式的优点是没有数据冗余,但是缺点也是很明显的,那就是,当我们想根据Parent来查找满足Parent的Child1和Child2的时候,就必须同时对两张数据库表进行查找,当继承数横向很大的时候,这种查找将导致大量的性能下降。
3、一个类映射到一个表(ONE_CLASS_ONE_TABLE):
对于上面的类结构,对于的数据库表如下。
这种模式下,每个类对应于一个数据库表,其中字表和父表通过ID进行关联。当然这种方式的优点是数据冗余小,但是缺点是,当继承关系很复杂的时候,我们构造SQL也会变得相当复杂,从而导致修改变的也很复杂。效率也会降低。当然了,如果一个类没有父类也没有子类哪么上面三种模式都是一样。
二、对象的组合结构:
对象的组合结构是指一个对象中包含若干不同类型的子对象,比如人(Person)对象包含了手(Hand)对象,头(Head)对象等。这些都是ORM应该考虑的问题。
三、对象状态:
对象一般包括如下几个状态:
1、还没有和任何数据库数据关联的对象,比如刚new出来的对象,此时对象中没有任何实际数据。
2、对象初始化并且设置了属性值,但是还没有被保存,此时需要使用ORM的Insert功能。
3、从数据库中读取出来的数据对象,并且已经修改,此时对象对应于数据库中某条记录。
4、数据库中记录已经被删除了的对象。
上面几种状态需要在我们的ORM中能有所体现。比如对于第一种状态,我们需要对其设置属性值,然后转换成第二种状态。在ORM中执行Insert操作。对于第三中状态,我们需要执行Update操作,第四种状态我们应该进行错误提示。
四、ORM中的事物处理:
事物处理是每个底层框架都应该考虑的问题,即使不能提供自有的事物处理模型,至少也要能够提供能够进行事物处理的接口等。
.NET中事物处理有两种方式,一种是使用COM+,通过使用TransactionScop来实现事物处理,这种方式性能有一定的下降,但是整个代码显得非常优美。另外一种方式是通过SqlTransaction来实现事物处理。由于我曾经被COM+弄的很惨,所以我这里推荐使用SqlTransaction。
五、O/R Mapping的一般做法:
要实现对象和关系之间的映射,我们需要定义映射规则,也就是类的属性和数据库表字段之间的一一对应规则。比如上面所说的Child1.Property3对应数据库表中的Field3字段。在.NET中我们可以通过自定义Attribute来实现。好像也能够通过配置文件来描述映射规则,但是我这里仅仅讨论的是Attribute的形式。
相关文章:
C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
C#基础系列:实现自己的ORM(构造我自己的ORM)
C#基础系列:实现自己的ORM(MiniORM的测试代码)
源代码下载
分享到:
相关推荐
ORM,全称Object-Relational Mapping,即对象关系映射,是一种编程技术...通过对这个轻量级ORM类库源代码的学习,开发者不仅可以提升自己的C#技能,还能深入理解ORM的工作原理,为实际项目开发中的数据库操作提供便利。
本资源“C#实现自己的ORM系列源码(MiniORM).rar”提供了这样一个学习和实践的机会。它包含了一个名为MiniORM的简单ORM框架的源代码,以及一个解决方案文件MiniORM.sln,用于在Visual Studio中编译和运行项目。此外,...
标题提到的"C# ORM程序"是指基于C#语言实现的ORM框架,它可能包含一系列类库和工具,用于与多种类型的数据库(MySQL, SQLite, SQLServer, Oracle, Access)进行交互。ORM工具的核心功能包括但不限于数据查询、事务...
"Grove.ORM"是一个基于C#实现的ORM框架,它简化了数据库访问,通过提供一种直观的面向对象的方式来操作数据库。 Grove.ORM的核心思想是将数据库表与C#类关联,数据库记录与类实例对应,表字段与类属性对应。这样,...
标题中的"C# Sqlite ORM"指的是使用C#编程语言实现的SQLite对象关系映射(ORM)框架。ORM是一种编程技术,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句。SQLite是一个轻量级的关系型数据库...
在C#中,ORM框架可以帮助开发者无需编写大量的SQL语句,就能实现对数据库的操作,极大地提高了开发效率。这款ORM工具显然是针对SQL数据库设计的,其轻量级特性意味着它可能更注重易用性和性能,而不是提供复杂的企业...
最最最最最最基础的操作数据库增删改查,支持事务,通用类,理论上支持MsSql,Oracle,OleDb,MySql,...(由于后两种需要额外引入相关Dll,因此本类中不包含实现,自己添加即可。) 本类只是提供一种思路,可以参考。
Sqlite ORM 是一个简单的C#类,对Sqlite的操作进行了封装,主要功能包括:表定义、生成,访问,更新等,其中,支持,多表的连接操作,语法类似Linq语法,使用非常方便,附加了使用说明文档。 例如,添加记录操作为...
在.NET框架下,AdoNet是微软提供的一套用于访问数据库的标准API,而ORM则是在此基础上进行抽象,帮助开发者避免直接编写SQL语句,提高开发效率和代码可维护性。 自定义ORM框架的设计通常包括以下几个关键部分: 1....
【内容概要】:在C#中通过学习使用Attribute,实现一个简单的ORM框架。里面主要有两部分的内容,学习使用Attribute获得设定值;学习通过反射获取属性的值 【适应人群】:初级工程师。但需要对反射、Attribute有一定...
总结来说,ORM框架是为了解决关系型数据库与面向对象编程之间的不匹配问题,反射和特性是C#中实现ORM的关键工具。反射提供运行时的类型信息和动态操作,特性则作为对象与数据库映射的标记。通过学习和应用这两者,...
【标题】:“手写ORM”指的是自己动手实现Object-Relational Mapping(对象关系映射)技术,这是一种在软件开发中将数据库操作与业务逻辑解耦的方法。ORM允许开发者使用面向对象的方式来操作数据库,无需关心底层SQL...
在这个"C#实例ORM"中,我们将探讨如何在C#环境下,特别是在Visual Studio 2010或更高版本中,利用属性反射来实现数据表字段与类属性之间的映射。 首先,理解属性反射是关键。在C#中,反射是一种强大的工具,它允许...
4. **查询语言**:ORM框架通常提供自己的查询语言,如LINQ(Language Integrated Query),使得开发者可以用类似SQL的方式在C#代码中进行查询,但无需直接编写SQL语句。 5. **懒加载与预加载**:ORM支持数据加载...
C# ORM映射 开发及原理 公司内部开发的ORM 源码 禁止商业用途,违者必究!
.NET ORM框架,基于Dapper效率高,包括根据条件Update,Delete有修改字段,各种单表查寻,操作简单。 支持分库,简单分页,暂不支持分表(想办法支持中,有头续的可以联系)。联系:else-love@qq.com
C#Sqlite的ORM工具easyliter下载,附源码. 内含DEMO
SQLite3的ORM(Object-Relational Mapping)框架是一种在C++编程中将数据库关系模型与对象模型进行对应的技术。ORM框架使得开发者可以使用面向对象的方式来操作数据库,避免了直接编写SQL语句,提高了开发效率和代码...
在C# .NET中使用ORM时,主要涉及以下几个关键概念: - 映射配置:定义对象和数据库表之间的关系,包括字段映射、主键设置、关系映射等。 - 数据上下文(DbContext):在Entity Framework中,DbContext是应用程序与...