【EF 4】ORM框架及其流行产品之一EF介绍
导读:跳进了多租户切换数据库的坑,那么就继续走下去吧。在我们的项目中,是运用EF实现对数据库的操作,那么EF其实是.NET系统中,基于ORM框架的一个产品实现。在java那边,则有Hibernate和ibatis等具体实现。既然研究的是ORM的具体实现,那么还是很有必要介绍一下ORM的原理的。因为本人主要是基于EF研究,所以在描述过程中,均已EF开发作为实例。
一、ORM
1.1,概念
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
1.2,概念理解
O(Object)
它是程序设计中的对象,具体说来,也就是在开发过程中,所建立的Model层,在Model层中,每一个类都描述了一个对象,比如说:
<span style="font-family:KaiTi_GB2312;font-size:18px;">using System;
using System.Collections.Generic; namespace MyModel.Models
{
public partial class TestTableone
{
public string Id { get; set; }
public string name { get; set; }
public string sex { get; set; }
public string testcolumn { get; set; }
}
}
</span>
上面的这个类,其实是描述了一个对象:TestTableone
R(Relational )
它是程序设计中的关系数据库(ORM框架,一般来说对应的是关系型数据库),具体说来,它其实是描述作为咱们数据持久层里面的表单。也就是说,它实际上是指咱们设计好的数据库对象,每张表单的字段、主外键、索引等。
M(Mapping)
比起映射,或者说直接理解为地图,更能让我们接受。想象地图在我们生活中是用来干嘛的?它能帮助我们找到目的地。那么,在程序中,mapping文件是用来干嘛的呢?这就涉及到ORM框架的工作原理,我们将在第二部分进行介绍。
图像理解:
二、EF工作原理
ORM框架最基本的工作原理,其实就是通过操作O(对象)去实现操作R(表单),而他们之间的连接或者说桥梁,就是Mapping(映射)。
下面,主要介绍一下产品EF的工作原理:
2.1,EF框架示意图
2.2,原理分析
首先,基于最底层的是SSDL,与之对应的是ADO.net的存储模型(数据库服务器)驱动。这里进行了数据库服务驱动,以及数据库的描述。
然后,基于中间层的是CSDL,与之对应的是EntityClient的实体数据驱动,在这里确定了ORM框架中的驱动形式,EF中使用EF驱动,ORM其他产品,都有自己对应的驱动。在这里面,是对于EF中的实体对象进行了描述。
最后,基于最上层的是对象元数据和对象服务,包含了对于对象的一系列操作。
那么,EF工作的时候,它通过最上层的对象服务,去操作对象元数据,而后过渡到EF的数据驱动,将最上层的操作,通过CSDL规则文件进行描述。然后紧接着,借助MSL映射规范,将CSDL描述的的内容,对应到SSDL(数据库表单),最后通过ADO.net的数据驱动,将SSDL描述的内容读写到具体的数据库。到最后进行读写操作的,一定会是数据库服务驱动所要求的语言,这一个过程,也是使用linq toSQL的一个具体流程。
三、EF的优缺点
3.1,优点
隐藏了数据访问细节,“封闭”的通用数据库交互,这是ORM的核心。它使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。
ORM使我们构造固化数据结构变得简单易行,不用将模型操作转化为一条一条的SQL语句。
3.2,缺点
EF牺牲了性能,虽然在于SQL语句转化的时候,耗费的时间非常小,但是它仍然远远没有直接执行SQL语句速度快。
对于一种复杂的查询,EF显得力不从心。最为显著的一个就是,多表联合查询。
四、总结
先来看下面一段话:
As good object-oriented developers got tired of this repetitive work, their typical tendency towards enlightened laziness started to manifest itself in the creation of tools to help automate the process.
When working with relational databases, the culmination of such efforts were object/relational mapping tools.
作为一个优秀的开发人员,已经厌倦了这种重复的工具(重复的编写SQL语句),他们有一种典型的倾向,一种高效的懒惰开始显示出来:去创造一种工具,帮助实现自动化过程。当和关系型数据库打交道时,这种高明懒惰的努力成果是:ORM框架。
ORM框架到底是一种Helper,帮助我们实现了操作数据库语句的封装,它在本质上就等同于我们之前所写过的SQLHelper,当它的封装,满足不了自己的开发时,我们就开始抱怨。当它的封装可以满足时,我们就开始窃喜。可是,ORM对于自己的定位,从来都不是一种全能全效的产品,它只是一种工具。结合到目前的项目来看,我们想要依靠EF去实现多租户的数据库切换,我们在抱怨它能实现的模式,有弊端。没弊端的模式,实现不了,或者是困难重重。但是,这都是我们自己的要求太高了,框架本身就是一种平衡。有所舍弃,才有所获得。又想好又想巧,买个老驴不吃草,这都是不现实的。
下面会陆续总结在项目中所遇到的困难和分析,目前我们的实现有很多的问题,如有高人到此,请不吝赐教。
【EF 4】ORM框架及其流行产品之一EF介绍的更多相关文章
- .Net 常用ORM框架对比:EF Core、FreeSql、SqlSuger
前言: 最近由于工作需要,需要选用一种ORM框架,也因此对EF Core.FreeSql.SqlSuger作简单对比.个人认为各有有优势,存在即合理,不然早就被淘汰了是吧,所以如何选择因人而议.因项目 ...
- 轻量级ORM框架初探-Dapper与PetaPoco的基本使用
一.EntityFramework EF是传统的ORM框架,也是一个比较重量级的ORM框架.这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择. 1.1 准备一张数据库 ...
- 吉特仓库管理系统-ORM框架的使用
最近在园子里面连续看到几篇关于ORM的文章,其中有两个印象比较深刻<<SqliteSugar>>,另外一篇文章是<<我的开发框架之ORM框架>>, 第一 ...
- 轻量型ORM框架Dapper的使用
在真实的项目开发中,可能有些人比较喜欢写SQL语句,但是对于EF这种ORM框架比较排斥,那么轻量型的Dapper就是一个不错的选择,即让你写sql语句了,有进行了关系对象映射.其实对于EF吧,我说下我 ...
- 2022年了有哪些值得推荐的.NET ORM框架?
前言: 最近有很多同学问我.NET方面有哪些好用的ORM框架,我觉得这方面的介绍网上应该会介绍的比较全面文章,于是我想搜一篇全面的介绍文章发给他们结果我发现网上说来说去基本上就是那几个,于是就有了这篇 ...
- 轻量级ORM框架 QX_Frame.Bantina(二、框架使用方式介绍)
轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...
- 轻量级ORM框架 QX_Frame.Bantina(一、框架简介)
轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...
- 常用的ORM框架
现在,很多项目使用ORM的框架构架实现数据持久层,下面列举一些常用的ORM框架有,后续分节介绍. Java:Hibernate和Mybatis(前身iBatis) .Net:EF6与EFCore.Da ...
- EF、Dapper、NHibernate等ORM框架的比较及优缺点
什么是ORM? ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操 ...
随机推荐
- 2.Could not open Selected VM debug port (8700). Make sure you do not have another instance of DDMS or of the eclipse plugin running
在eclipse.ini配置文件最后加上:-Djava.net.preferIPv4Stack=true 其他类似
- [实变函数]5.4 一般可测函数的 Lebesgue 积分
1定义 (1)$f$ 在 $E$ 上积分确定 $\lra$ $\dps{\int_Ef^+(x)\rd x<+\infty}$ 或 $\dps{\int_Ef^-(x)\rd x<+\in ...
- filter的执行顺序
一直没有仔细去研究下filter ,最近系统的测试了下: 先看代码吧 FirstFilter.java ================== package com.test.filter; impo ...
- 学习git遇到的一些简单错误
From:http://stackoverflow.com/questions/7574459/prompted-for-password-on-git-pull-origin-branch [roo ...
- block作为类的属性时用copy
1. block作为类的属性时用copy Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的 <栈 :由系统维护的局 ...
- git查看历史命令
1 git show git show 分支名/HEAD/hash值 2 git log参数 --oneline 单行信息--decorate 输出commit引用信息--graph 图形化输出--a ...
- PHP 时区设置
有时候使用date("Y-m-d h:i:s")时发现时间相差8小时,修改“/etc/php5/apache2/php.ini”: date.timezone = "As ...
- freemarker空值的多种处理方法
默认情况下,freemarker的变量必须有值,如果没有被赋值的变量在页面上使用就会抛出异常,出错的信息都会显示在页面上. 解决办法: 方法一.我们可以在页面上使用freemarker变量时 以 ${ ...
- C Primer Plus(第五版)1
这是C Primer Plus(第五版)的第一章,上传上来主要是方便我进行做笔记,写注释,还有我会删掉一些“废话”等. 1.1 C语言的起源 贝尔实验室的 Dennis Ritchie 在1972年开 ...
- C++primer 练习13.39
13.39 编写你自己版本的StrVec,包括自己版本的reserve,capacity(参见9.4节,第318页)和resize(参见9.3.5节,第314页) 13.40 为你的StrVec类添加 ...