ORM系列之Entity FrameWork详解
一. 谈情怀
从第一次接触开发到现在(2018年),大约有六年时间了,最初阶段连接数据库,使用的是【SQL语句+ADO.NET】,那时候,什么存储过程、什么事务 统统不理解,生硬的将SQL语句传入SQLHelper类中,后来知道还要注意SQL注入,引入参数化的方式,现在回想一下,那个阶段简直Low到爆。
(PS:现在很多场景下还是需要使用ADO.NET,所以没有最好,只有最适合)
凡事都是从零开始的,正是这个阶段积累,才有了后续的发展。一次机会,接触到了微软的EF(ps:如果没有记错的话,当时用的是EF 5.0 的DBFirst模式),彻底颠覆了我的开发观念,不需要写SQL语句(那时还不清楚EF也可以调用SQL语句),Lambda表达式(并不知道Lambda还分Lambda表达式和Lambda语句),兴奋了一阵,然后进入了漫长的EF摸索和填坑阶段了(EF5.0→EF6.2→EF Core)。
如果你觉得EF不灵活,不能调用存储过程或自定义事务?如果你觉得EF在处理海量数据库的时候会很慢?如果你觉得EF满足不了你的开发需求?。。。。。。 那么也许该系列的文章会对你有些帮助。
二. ORM框架
说起DotNet领域的ORM框架,我们想到的有EF、NHibernate、FluentData、Dapper、SQLSugar等等。那么到底什么是ORM呢?
ORM(Object Relational Mapping),中文名字:对象关系映射,它是面向对象思想的进一步的发扬光大,主要实现【程序对象】到【关系型数据库】的映射。在之前使用ADO.NET开发的时候,数据库访问层(即 DAL),要写很多增加、删除、保存的方法,很是麻烦,如果引入ORM框架,它自带CRUD的API(相当于DAL层已经给你写好了),可以自动生成SQL语句,所以作为开发者而言,只需要关注对象即可。
ORM的含义:
① O:Domain Object 领域模型
② R:Relational DataBase 关系型数据库
③ M : Mapping 映射关系
ORM的三大核心原则:
① 简单性:以最简单的模式建模数据。
② 传达性:数据库结构被任何人都能理解的语言文档化。
③ 精确性:基于数据模型创建正确标准化的结构。

EF的核心架构:

① EDM(Entity Data Model):这是微软提供的一个强大的可视化工具,用来生成 O、R、M的
② 两种语法的查询:LINQ to Entities 和 Entity SQL
③ ObjectServices:Linq to Entities 和Entity Client Data Provider 之间起到转换作用
④ Entity Client Data Provider: 将Lambda转换成SQL语句
⑤ ADO.Net Data Provider: 标准的ADO.Net
⑥ DataBase:数据库
三. 从EF的入手,深入理解ORM框架
EF(Entity FrameWork),是微软推出基于ADO.NET的数据库访问技术,它是一套ORM框架, 框架中包括了实例模型、数据模型、关系映射三部分,EF的上下文为DbContext,EF在 【.Net FrameWork】版本中最新的是 6.2.0 版本,最稳定的是6.2版本,在【.Net Core】中推出 EF Core (即所谓的“EF7”,^_^,当然已经不这么叫了)。
EF包括三种模式:DBFirst、CodeFist、ModelFirst 。EF可以调用SQL语句、可以使用Linq查询、可以使用Lambda查询,EF还有很多高级属性,比如延迟加载、缓存属性等等,在该系列文章中都将逐一详细介绍。
EF也有优缺点:
优点:① EF是微软自家的产品,和VS的集成度很高,极大的提高了开发效率。
② EF中ModelFirst模式提供的模型设计器功能很强大,且采用T4模板生成的代码的功能很强大。
③ 支持多数据库开发,简单的改变配置文件,就可以切换数据库。
缺点: 在复杂的查询生成SQL脚本的效率不是很高,浪费了性能。
举例:之前在开发中,一张幼儿表里大约有60个字段左右,一个业务需要根据复杂的条件查询出来一些信息(大约5个字段左右),当时由于按开发人员的失误,写的Lambda表达式直接将所有字段查询出来,导致该业务耗时很长大约25s左右,后来在我的引导下,先去数据库中直接写SQL语句,查询所有字段,发现速度很快;然后将EF中的Lambda查询改为只查询指定的5个字段,发现速度由25s→3s左右,提升非常明显,当然这也很好的说明了EF的局限是在生成SQL的脚本效率上。
四. 系列章节
第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式。
第二节: 比较EF的Lambda查询和Linq查询写法的区别。
第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery )
第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法
第五节: EF高级属性(一) 之 本地缓存、立即加载、延迟加载(不含导航属性)
第六节: EF高级属性(二) 之延迟加载、立即加载、显式加载(含导航属性)。
第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)。
第八节: EF的性能篇(一) 之 EF自有方法的性能测试 :
第九节: EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解决EF的性能问题 :
第十节: EF的三种追踪实体属性变化方式(DBEntityEntry、ChangeTracker、Local) :
第十一节: EF的三种模式(一) 之 DBFirst模式(SQLServer和MySQL两套方案):
第十二节: EF的三种模式(二) 之 ModelFirst模式(SQLServer为例):
第十三节: EF的三种模式(三) 之 来自数据库的CodeFirst模式 :
第十四节: EF的三种模式(四) 之 原生正宗的 CodeFirst模式的默认约定 :
第十五节: EF的CodeFirst模式通过DataAnnotations修改默认协定 :
第十六节: EF的CodeFirst模式通过Fluent API修改默认协定 :
第十七节: EF的CodeFirst模式的四种初始化策略和通过Migration进行数据的迁移 :
第十八节: EF的CodeFirst模式连接MySQL数据库的解决方案(未完成) :
第十九节: 结合【表达式目录树】来封装EF的BaseDal层的方法 :
第二十节: 深入理解并发机制以及解决方案(锁机制、EF自有机制、队列模式等):
第二十一节:ADO层次上的海量数据处理方案(SqlBulkCopy类插入和更新):
第二十二节: 以SQLServer为例介绍数据库自有的锁机制(共享锁、更新锁、排它锁等) :
第二十三节: EF性能篇(三)之开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题 :
PS:EF Core 将单独一个系列,敬请期待。。。。 该系列的EF后续将持续更新。
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址
ORM系列之Entity FrameWork详解的更多相关文章
- ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借
ASP.NET MVC深入浅出系列(持续更新) 一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...
- 21.翻译系列:Entity Framework 6 Power Tools【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/entity-framework-power-tools.aspx 大家好,这里就是EF ...
- Hexo系列(三) 常用命令详解
Hexo 框架可以帮助我们快速创建一个属于自己的博客网站,熟悉 Hexo 框架提供的命令有利于我们管理博客 1.hexo init hexo init 命令用于初始化本地文件夹为网站的根目录 $ he ...
- 【ORM】--FluentNHibernate之AutoMapping详解
上篇文章详细讨论了FluentNHibernate的基本映射的使用方法,它的映射基本用法是跟NHibernate完全一样的,首先要创建数据库链接配置文件,然后编写Table的Mappin ...
- .NET6 平台系列3 .NET CLR 详解
系列目录 [已更新最新开发文章,点击查看详细] CLR 简介 运行时(Runtime Environment,简称Runtime ),是指那些支持在特定的平台上,用于运行特定编程语言编写的软件 ...
- Signalr系列之虚拟目录详解与应用中的CDN加速实战
目录 对SignalR不了解的人可以直接移步下面的目录 SignalR系列目录 前言 前段时间一直有人问我 在用SignalR 2.0开发客服系统[系列1:实现群发通讯]这篇文章中的"/Si ...
- 转载爱哥自定义View系列--文字详解
FontMetrics FontMetrics意为字体测量,这么一说大家是不是瞬间感受到了这玩意的重要性?那这东西有什么用呢?我们通过源码追踪进去可以看到FontMetrics其实是Paint的一个内 ...
- 转载爱哥自定义View系列--Paint详解
上图是paint中的各种set方法 这些属性大多我们都可以见名知意,很好理解,即便如此,哥还是带大家过一遍逐个剖析其用法,其中会不定穿插各种绘图类比如Canvas.Xfermode.ColorFilt ...
- .NET ORM框架 SqlSuagr4.0 功能详解与实践【开源】
SqlSugar 4.0 ORM框架的优势 为了未来能够更好的支持多库分布式的存储,并行计算等功能,将SqlSugar3.x全部重写,现有的架构可以轻松扩展多库. 源码下载: https://gith ...
随机推荐
- zabbix调用api检索方法
环境 zabbix:172.16.128.16:zabbix_web:172.16.16.16/zabbix 用户名:Admin 密码:zabbix 获取的数据仅做参考,以Linux发送HTTP的PO ...
- Linux CentOS 6 解决 Device eth0 does not seem to be present
一.故障现象: [root@c1node01 ~]# service network restart Shutting down loopback insterface: ...
- July 12th, 2018. Thursday, Week 28th.
People love what other people are passionate about. 人总是会爱上别人倾注热情的事物. From La La Land. This quote has ...
- 自定义 js 文件的集成引用
这里的内容, 提前要知道 import comm from ‘...’ 和 import { comm } from ‘...’ 的基础知识. 我举个案例, 当你有很多api文件的时候, 比如 ...
- day09(垃圾回收机制)
1,复习 文件处理 1.操作文件的三步骤 -- 打开文件:硬盘的空间被操作系统持有 | 文件对象被应用程序持续 -- 操作文件:读写操作 -- 释放文件:释放操作系统对硬盘空间的持有 2.基础的读写 ...
- .Net Core学习地址
官方教程:https://docs.microsoft.com/zh-cn/aspnet/core/ 入门无忧网:http://www.rm5u.com/netcore/netcore-intro.h ...
- 配置spring的监听器 让spring随项目的启动而启动
<!-- 配置spring的监听器 让spring随项目的启动而启动 --> <listener> <listener-class>org.springframew ...
- 「FHQ Treap」学习笔记
话说天下大事,就像fhq treap —— 分久必合,合久必分 简单讲一讲.非旋treap主要依靠分裂和合并来实现操作.(递归,不维护fa不维护cnt) 合并的前提是两棵树的权值满足一边的最大的比另一 ...
- THUWC2019 游记
DAY1 开场先看 t1,发现答案的分子就是 \(\sum_i\) 颜色 \(i\) 在 A 中的出现次数乘上颜色 \(i\) 在 B 中的出现次数,分母就是 B 的长度,就去写了一个按颜色的出现次数 ...
- gnocchi resource批量删除
openstack监控告警,采集数据,部署VMware-controller后,之前的celometer采集的大量数据需要删除 1.第一部获取未采集所有虚拟机的IP,并组成grep -v 多条件的格式 ...