重新认识Entity Framework
什么是Entity Framework
Entity Framework是一个对象关系映射O/RM框架。
Entity Framework让开发者可以像操作领域对象(domain-specific objects)那样操作关系型数据(relational data)。
Entity Framework减少了大部分通常需要编写的数据操作代码。
Entity Framework中可以使用LINQ来查询数据,使用强类型(strongly typed objects)来检索和操作数据。
Entity Framework提供了以下服务,使开发者可以更加侧重于程序业务逻辑,而非数据访问的基本操作。
1. 状态或变更跟踪(change tracking)
2. 身份或主键识别(identity resolution)
3. 懒加载(lazy loading)
4. 查询翻译(query translation)
Entity Framework是ADO.NET的加强,它给开发者提供了数据库访问和存储的自动化机制。
Entity Framework是一个开源框架。
什么是O/RM
O/RM是一种工具,可以自动地把领域对象数据存储到关系型数据库(如MS SQL Server),而不需要大量的编码。
O/RM包含三个重要的部分:
1. 领域对象(Domain class objects):我们定义的类。
2. 关系型数据库对象(Relational database objects):数据库表,视图,存储过程等。
3. 映射信息(Mapping information):领域对象与关系型数据库对象之间转换的信息。
O/RM允许开发者把数据库设计和领域对象设计独立开,让程序更具有可维护性和可扩展性。
它还提供了基本的增删改查的功能,开发者不需要手动再编写这部分代码。
一个典型的数据库与应用程序的O/RM交互如下图所示:

Entity Framework的结构
Entity Framework的总体结构如下图所示。

EDM(Entity Data Model):EDM包含三个主要的部分 - 概念模型(Conceptual model)、存储模型(Storage model)和映射(Mapping)。
1. Conceptual model:概念模型包含了模型的类定义,以及类之间的关系。概念模型的设计独立于数据库表设计。
2. Storage model:存储模型是数据库设计模型,包含了数据库表,视图,存储过程,以及它们的之间的关系和键。
3. Mapping:映射包含了概念模型映射到存储模型的相关信息。
LINQ to Entities:一种基于对象模型编写的查询语言,它将返回概念模型中设计的实体。
Entity SQL:另一种和LINQ to Entities相似的查询语言,但是它们还是有一些差异的,开发者还是需要单独花时间去学习它。
Object Service:数据库数据访问的主要入口,主要职责是物化(materialization),把Entity Client Data Provider返回的数据转换成实体对象结构。
Entity Client Data Provider:把LINQ to Entities或Entity SQL转换成数据库SQL。和ADO.Net Data Provider进行通讯,发送或检索数据库数据。
ADO.Net Data Provider:ADO.Net Data Provider使用标准的ADO.Net和数据库进行交互。
Entity Framework的开发模式
Entity Framework提供了三种开发模式:
1. Code First
2. Database First
3. Model First
Code First:

在Code First的开发模式中,要避免使用视觉模型设计器(EDMX),一般是先编写POCO类,然后根据这些类去生成数据库。
那些遵循领域驱动开发(DDD)原则的开发者,更倾向于一开始先编写自己的领域类,然后再生成数据库来实现数据持久化。
Database First:

通过已有的数据库来生成EDMX(Entity Data Model)的开发模式就是Database First的开发模式。
如果数据库变更了,EDMX(Entity Data Model)也会更新。同时,Database First也支持存储过程,视图等。
Model First:

Model First是Code First和Database First的一种折中开发模式,它提供视觉模型设计器(EDMX)来设计数据模型,然后根据数据库模型来生成数据库以及领域类。
总结:
1. Code First是先编写领域类,然后根据类来生成数据库,无视觉模型设计器(EDMX)。
2. Database First是根据数据库生成视觉模型设计器(EDMX)及领域类。
3. Model First是先生成视觉模型设计器(EDMX),然后根据EDMX生成数据库及领域类。
选择Entity Framework开发模式

1. 如果你有一个现成的程序,并且已经定义了领域类,那么,可以使用Code First的开发模式来生成数据库进行开发。
2. 如果你有已个现成的数据库,那么,可以使用Database First的开发模式来生成EDM进行开发。
3. 如果你没有现成的数据库,也没有定义好的领域类,而你更倾向于使用图形化界面来设计数据库模型,那么,可以使用Model First的开发模式进行开发。
我个人的话,任何情景都会使用Code First的开发模式,因为它比较灵活,但是对开发者本身的要求会更高一些。
DbContext

DbContext是Entity Framework的一个重要部分,它是领域或实体类与数据库之间的桥梁。
DbContext是一个很重要的类,主要职责是以对象的方式和数据进行交互,它包含以下活动:
EntitySet:DbContext包含实体集合(DbSet<TEntity>),把实体映射到数据库表。
Querying:DbContext把LINQ to Entities查询转换成SQL查询,并发送到数据库。
Change Tracking:DbContext会跟踪从数据库查询出来的实体的状态变更。
Persisting Data:DbContext根据实体的状态提供插入,更新和删除等数据库操作。
Caching:DbContext默认实现一级缓存,在Context类的生命周期期间,它会保存检索出来的实体。
Manage Relationship:Database First或Model First中,使用CSDL,MSL,SSDL来管理关系,在Code First中使用Fluent API来管理关系。
Object Materialization:DbContext把表原始数据转换成实体对象。
实体生命周期
在实体的生命期中,每个实体都有一个基于上下文(DbContext)的操作的实体状态。
实体状态是一个System.Data.Entity.EntityState类型的枚举,它包含以下的值:
Added:实体正在被上下文跟踪,但还不存在于数据库中。
Deleted:实体正在被上下文跟踪并存在于数据库,但被标记为从数据库删除。
Modified:实体正在被上下文跟踪并存在于数据库,而且实体的一些或所有属性的值被修改了。
Unchanged:实体正在被上下文跟踪并存在于数据库,但实体的所有属性值都没被修改。
Detached:实体不被上下文跟踪。
下图说明了实体状态如何影响数据库操作。

1. 新的实体具有Added的状态,DbContext后续会在数据库中执行插入操作。
2. 通过LINQ检索出来的实体具有Unchanged的状态,但如果调用了AsNoTracking()方法,其状态为Detached。
3. 修改了检索出来的实体的属性值,实体会修改状态为Modified,DbContext后续会在数据库中执行更新操作。
4. 需要删除的实体会具有Deleted的状态,DbContext后续会在数据库中执行删除操作。
5. 对于DbContext中已有的实体,可以通过dbContext.Entry(entity).State = EntityState.Detached的方式把状态设置为Detached。
Entity Framework版本
|
版本 |
引入功能 |
|
EF 3.5 |
Database First模式下基本的O/RM支持。 |
|
EF 4.0 |
POCO的支持, 懒加载, 可测试性提升,定制化代码生成,以及引入Model First开发模式。 |
|
EF 4.1 |
在ObjectContext的基础上简化了DBContext API,引入Code First开发模式。 |
|
EF 4.3 |
引入Code First Migrations,可以根据定义的Code First模型来创建或修改数据库。 |
|
EF 5.0 |
宣布EF为开源项目。引入了枚举支持,表值函数, 空间数据类型,模型多图表,设计界面着色形状,批量导入存储过程,EF Power Tools,以及各种性能提升。 |
|
EF 6.0 |
引入了许多Code First & EF设计相关的新功能,如异步操作(asynchronous),弹性连接(connection resiliency),依赖解析(dependency resolution)等。 |
注:Entity Framework Core不在本文讨论范围。
参考资料
本文大部分内容来自:Entity Framework Tutorial
少量内容参考:Entity Framework官网
重新认识Entity Framework的更多相关文章
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- Entity Framework Core 1.1 升级通告
原文地址:https://blogs.msdn.microsoft.com/dotnet/2016/11/16/announcing-entity-framework-core-1-1/ 翻译:杨晓东 ...
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...
- 采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)
前言 Entity Framework 延伸系列目录 今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC Mi ...
- 来,给Entity Framework热热身
先来看一下Entity Framework缓慢的初始化速度给我们更新程序带来的一种痛苦. 我们手动更新程序时通常的操作步骤如下: 1)把Web服务器从负载均衡中摘下来 2)更新程序 3)预热(发出一个 ...
- 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)
前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...
- Entity Framework教程(第二版)
源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,E ...
- Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新
因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第一章:创建基本的MVC Web站点
在这一章中,我们将学习如何使用基架快速搭建和运行一个简单的Microsoft ASP.NET MVC Web站点.在我们马上投入学习和编码之前,我们首先了解一些有关ASP.NET MVC和Entity ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之目录导航
ASP.NET MVC with Entity Framework and CSS是2016年出版的一本比较新的.关于ASP.NET MVC.EF以及CSS技术的图书,我将尝试着翻译本书以供日后查阅. ...
随机推荐
- MATLAB符号运算 分类: 图像处理 2015-07-31 22:53 3人阅读 评论(0) 收藏
1.符号运算 使用MATLAB可以进行多项式乘除运算,也可以进行因式分解. 例1. 多项式乘除运算(x+3)3 >> syms x; >> expand((x+3)^3) an ...
- Android 中类似ModelWindow的一个实现
Android里一般的画面(Activity)都是尽量占满整个屏幕,这样符合单线程的设计, 而有些类似popup之类的子画面,却希望他弹出来的时候表现的如同web的模态窗口 (ModelWindow, ...
- 后台向前台传递entity的list然后构筑combobox的方法(easyui)
遇问题,莫着急,深呼吸. 后台写法:JsonUtil.toJson(new ArrayList<Entity>());此处jsonUtil是已封装的方法,即将entity的list转为js ...
- ExtJS参考手册
ExtJS是一个用javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架.因此,可以把ExtJS用在.Net.Java.Php等各种开发语言开发的应用中.ExtJs ...
- (转)现代C++函数式编程
本文转自:http://geek.csdn.net/news/detail/96636 现代C++函数式编程 C++ 函数式编程 pipeline 开发经验 柯里化 阅读2127 作者简 ...
- semat内核阿尔法的状态图
- HTTPS-使用Fiddler抓取HTTPS数据包原理
最近想尝试基于Fiddler的录制功能做一些接口的获取和处理工作,碰到的一个问题就是简单连接Fiddler只能抓取HTTP协议,关键的登录请求等HTTPS协议都没有捕捉到,所以想让Fiddler能够同 ...
- python [吐槽]关于nan类型时遇到的问题
今天在用写一段求和的代码时候,发现最后返回的是nan的结果,这段循环求和代码依次调用了三个函数,于是依次打印这三个函数的返回值,发现其中一个函数的返回值为nan,原来是因为这段函数里面没有相似的用户, ...
- ASP.NET中JSON的序列化和反序列化
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介 ...
- Spring和SpringMVC的区别
spring 是是一个开源框架,是为了解决企业应用程序开发,功能如下◆目的:解决企业应用开发的复杂性◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能◆范围:任何Java应用简单 ...