EF和Dapper之争的关键
突然发现园子里为EF和Dapper的事闹翻了天。(学Java的同学大概就是Hibernate和MyBatis之争了)
讲到EF对Mysql的支持,我在一边偷着乐:还好我用的是NHibernate,对Mysql的支持可好啦,哈哈……
咳咳,这样做当然是不对的,应该批评。我检讨三秒钟,先。
我看了文章,也看了评论(但没看完)。老实讲,我觉得三生石上只有一句话是站得住脚的:
真正出现问题的不是 Entity Framework,而是我们,好吧,就明说了吧:我们太想念 SQL 语句了!
其他的,嗯,已经有很多人说了很多了,我就不凑热闹了。
不知道大家还记不记得我以前说过:
虽然我们有C#这种面向对象的语言,但实际上我们很多开发人员仍然是“面向数据库”编程。
为了避免引发更大的争论,我必须首先声明:
面向对象和面向数据库并无优劣高下之分。
面向对象和面向数据库并无优劣高下之分。
面向对象和面向数据库并无优劣高下之分。
重要的事说三遍。
选择Dapper,甚至ADO.NET拼SQL,本质上就是“面向数据库”编程。什么意思呢?所有的开发过程是以数据库为基础的,整个系统的架构是以数据库的库表结构为依托的。当遇到一个业务逻辑的时候,首先想到的是这数据放在哪几张表里的,用什么SQL语句把它们给取出来,然后才想着怎么把这些数据封装成类……这就是我所谓的“面向数据库”编程。
那么与之相对的,什么是“面向对象编程”呢?
忘掉数据库,尤其是关系型数据库,我以前讲过,你可以想象成这数据最终是存放在XML文件里的、存放在NoSQL里的、存放在其他什么什么磁盘里面的。当然,最理想的,是有一个“对象数据库”,所有的数据都是以对象形式存放的,数据与数据之间就是对象与对象的关系,有继承有引用,都是Load出来.出来的。总之,SQL语句完全不管用。所以,遇到一个业务逻辑的时候,首先想到的就是这些数据存放在哪些对象里面,怎么加载这些对象……
明白了吧?这才是“面向对象”的思路!
哪里有什么表,哪里有什么SQL?我们眼里只有对象!万物皆对象,阿弥陀佛……

但是,世上的事情啊,最怕就是这个但是!
没有“对象数据库”,只有“关系数据库”啊?这是一个始终无法回避的问题:几乎所有的企业级应用,都是以关系数据库为存储器的。这下就麻烦了,怎么办呢?
面向对象的拥趸们,就推出了ORM(Object Relational Map),在“对象”和关系数据库“表”之间做一个映射,希望能解决这个问题。大家一定要明白,ORM是O开头的,其核心其要义,是把object映射成Relational的表,Object是第一位的。而不是很多同学那样,把ORM当成一个SQL语句生成器或者SQL语言的封装,其作用就是“不写SQL”。不是这样的,本末倒置了呀,同学!那么,从这个意义上讲,Dapper就不算是一个ORM(不做定义上的争论,大家理解意思就行),他就是一个理想的DBHelper而已。
相应的,EF作为一个沉重的ORM工具,就被嫌弃了。这是自然而然的,我不知道我说明白了没有,当你的思维是“面向数据库”的时候,ORM确实是一种负担,不仅仅是因为它的“沉重”,更因为它遮蔽了SQL实现的细节:看不到SQL,我心里不踏实啊!还要特么的设个断点查查log看看生成的SQL啥样子的,这就憋屈了……
而且ORM在复杂对象映射、复杂查询的时候,确实会出问题,现在这工具还不能说是完美。
那咋整呢?
我觉得这就是一个个人(或者团队)的喜好问题了。
“面向数据库”本身其实没问题。基于数据库基于表结构,CRUD,又怎么啦?回归代码的本质,也符合KISS(Keep It Stupid Simple)原则啊!不计其数的成功项目都这样完成的,而且也一直良好运作。相反的,完全的“面向数据库”设计架构的,崩了的项目也不少吧?
但是,我个人而言,更倾向于“面向对象”的思路和方向。主要有这么几个原因:
- 不喜欢SQL。这恐怕是决定性的原因,尤其憎恨存储过程,尤其尤其受不了那种几百上千行的存储过程,崩溃了一样的感觉。“面向数据库”的极致就是“存储过程编程”,假如都走极端,相比较而言,“面向对象”的极致我觉得都能接受——就全部代码见不着一行SQL嘛,没啥。
- ORM在不断的进步。EF我不熟,NHibernate5.0的很多新特性让我真的是眼前一亮,最鼓舞人心的就是Colletion上进行Query() 可以生成SQL查询而不用把整个collection加载进来。这是我期盼了不知多久的一个特性,太爽了!以前很多为了性能而做的walkaround就不需要了,代码会非常的清晰。我相信,ORM工具以后会一直进步,直到无限接近于完美,或者诞生“对象数据库”。“面向数据库”就根本不需要BLL层。把数据从数据库取出来,封装成类,何必呢?多此一举啊,完全是。就算要封装,我觉得强类型的DataSet就完全够用了。但DateSet这些已经凉了,说白了,“面向数据库编程”已经就那个样子了,能用,但没啥发展了;但ORM,还有很多人很多公司在努力的完善,还有进步的空间。
- 太多太多的工具或手段是必须和“面向对象”配合的。比如说单元测试,我不知道其他人怎么玩的,反正我的单元测试是隔离了数据库的,测试用的数据,直接new就OK了,又快又轻巧。混入了SQL语句或存储过程,必须连着数据库,这单元测试咋做?我还真不知道。另外的,领域驱动,“面向数据库”也没办法玩,你和“领域专家”讲表结构和SQL,人家会崩溃的。
- ORM保留了你在特殊情况下使用原生SQL的权利。实在不行的时候,还是可以自己写SQL的呀!
差不多了,我觉得可以简单总结一下,希望同学们:
- 能够从战略高度上理解“面向对象”和“面向数据库”的区别;
- 明白ORM的不足,但要对ORM的发展抱有信心。
咳咳,这腔调越来越像老师了。是的,人人都是程序猿已经开课很久了,今天是第18讲,入门型普及型课程,有兴趣的同学可以听一听,或者给周围的新人宣传宣传,先谢了!
EF和Dapper之争的关键的更多相关文章
- .NET Core、EF、Dapper、MySQL 多种方式实现数据库操作(动态注册实体类)
目录 前言 一.技术选型 二.遇到的坑 2.1..NET Core 下 EF 的问题 2.2.数据库实体类的注册 切记坑 前言 最近在学习.研究 .NET Core 方面的知识,动手搭建了一些小的 D ...
- EF架构~Dapper.Contrib不能将Linq翻译好发到数据库,所以请不要用它
回到目录 对于Dapper是一个轻量级的数据访问框架,而需要使用者去自己做SQL,它,只是一个数据访问者! 对些,Dapper推出了Contrib扩展包,它可以友好的让开发人员使用linq,而不需要写 ...
- EF、Dapper、NHibernate等ORM框架的比较及优缺点
什么是ORM? ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操 ...
- 同时支持EF+Dapper的混合仓储,助你快速搭建数据访问层
背景 17年开始,公司开始向DotNet Core转型,面对ORM工具的选型,当时围绕Dapper和EF发生了激烈的讨论.项目团队更加关注快速交付,他们主张使用EF这种能快速开发的ORM工具:而在线业 ...
- 用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记
[本文篇幅较长,可以通过目录查看您感兴趣的内容,或者下载格式良好的PDF版本文件查看] 目录 一.ORM的"三国志" 2 1,PDF.NET诞生历程 2 2,Linq2 ...
- 关于Dapper.NET的相关论述
年少时,为何不为自己的梦想去拼搏一次呢?纵使头破血流,也不悔有那年少轻狂.感慨很多,最近事情也很多,博客也很少更新了,毕竟每个人都需要为自己的生活去努力. 最近在一个群里遇到一个人说的话,在这里不再赘 ...
- EF通用数据层封装类(支持读写分离,一主多从)
浅谈orm 记得四年前在学校第一次接触到 Ling to Sql,那时候瞬间发现不用手写sql语句是多么的方便,后面慢慢的接触了许多orm框架,像 EF,Dapper,Hibernate,Servic ...
- Dapper.NET
关于Dapper.NET的相关论述 年少时,为何不为自己的梦想去拼搏一次呢?纵使头破血流,也不悔有那年少轻狂.感慨很多,最近事情也很多,博客也很少更新了,毕竟每个人都需要为自己的生活去努力. 最近 ...
- (转)用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记
原文地址:http://www.cnblogs.com/bluedoctor/p/3378683.html [本文篇幅较长,可以通过目录查看您感兴趣的内容,或者下载格式良好的PDF版本文件查看] 目录 ...
随机推荐
- Linux时间子系统专题汇总
关于Linux时间子系统有两个系列文章讲的非常好,分别是WowoTech和DroidPhone. 还有两本书分别是介绍: Linux用户空间时间子系统<Linux/UNIX系统编程手册>的 ...
- screen,client,page三种确定鼠标坐标的区别和原生JS事件写法,区别于Jquery的$.on(x,y);和$.click()
screenX clientX pageX的区别 screenX:鼠标位置相对于用户屏幕水平偏移量,而screenY也就是垂直方向的,此时的参照点也就是原点是屏幕的左上角. clientX:跟scre ...
- 你不知道的JavaScript--Item28 垃圾回收机制与内存管理
1.垃圾回收机制-GC Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存. 原理:垃圾收集器会定期(周期性 ...
- redis list命令操作
1.将值追加到列表 RPUSH key value [value ...]summary: Append one or multiple values to a listsince: 1.0.0 12 ...
- diskqueue.go
}
- MYSQL—— 启动MYSQL 57 报错“The service MYSQL57 failed the most recent........等”的问题解决方式!
每天开机之后,启动MYSQL Notifier就报错,第一次出现重启电脑后解决,后面的几天老是出现,重启电脑好几次都没有解决,感觉很烦人,一定要搞定这个问题找到原因,于是有了下文....... 启动M ...
- 书籍推荐Python编程:从入门到实践(高清完整pdf)
这本书我看了电子版的,感觉还不错,全书共有20章,书中的简介如下: 本书旨在让你尽快学会 Python ,以便能够编写能正确运行的程序 -- 游戏.数据可视化和 Web 应用程序,同时掌握让你终身受益 ...
- Java Native Interface调用C++代码
概述 Java Native Interface译为Java原生接口,简称JNI.Java并不是完美的,它的不足体现在运行速度要比传统的C++慢上许多,并且无法直接访问到操作系统底层,为此Java提供 ...
- 【Python3爬虫】你会怎么评价复仇者联盟4?
一.写在前面 最近复仇者联盟4正在热映中,很多人都去电影院观看了电影,那么对于这部电影,看过的人都是怎么评价的呢?这时候爬虫就可以派上用场了! 二.主要思路 首先打开豆瓣电影,然后进入复仇者联盟4的详 ...
- 企业私有源代码上传github致入侵之大疆案判决了
事件简单回顾: 1.2017年8月28日,大疆宣布“大疆威胁识别奖励计划”,最高3万美元: 2.然而在此之前,大疆农业事业部某员工将企业私有源代码上传到了github: 3.就职于大疆竞对公司Depa ...