什么是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相关推荐

  1. EF-Entity Framework 相关技术点收集贴

    不定期.偶尔.添加更新 在网络上看到或者自己开发过程中碰到的EF-Entity Framework相关技术点 本文地址:http://www.cnblogs.com/vnii/archive/2012 ...

  2. C#综合揭秘——Entity Framework 并发处理详解

    引言 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制.从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NET Entity Framework,.NET 都 ...

  3. 《你必须掌握的Entity Framework 6.x与Core 2.0》正式出版感想

    前言 借书正式出版之际,完整回顾下从写博客到写书整个历程,也算是对自己近三年在技术上的一个总结,整个历程可通过三个万万没想到来概括,请耐心阅读. 写博.写书完整历程回顾 从2013年12月注册博客园账 ...

  4. Entity Framework Code First在Oracle下的伪实现

    为什么要说是伪实现,因为还做不到类似MsSql中那样完全的功能.Oralce中的数据库还是要我们自己手动去创建的.这里,我们舍掉了Model First中的EDMX文件,自己在代码里面写模型与映射关系 ...

  5. Entity Framework:Code-First Tutorial开篇

    这个系列文章是关于Entity Framework Code-First的英文系列文章,内容不错,每篇一个主题知识点介绍,特转载过来 原文地址:http://www.entityframeworktu ...

  6. entity framework 使用Mysql配置文件

    2019独角兽企业重金招聘Python工程师标准>>> <?xml version="1.0" encoding="utf-8"?> ...

  7. Entity Framework CodeFirst数据迁移

    原文:Entity Framework CodeFirst数据迁移 前言 紧接着前面一篇博文Entity Framework CodeFirst尝试. 我们知道无论是"Database Fi ...

  8. 看看Entity Framework 4生成的复杂的分页SQL语句

    之前发现Entity Framework 4生成的COUNT查询语句问题,今天又发现它生成的分页SQL语句问题,而LINQ to SQL却不存在这个问题. >>> 来看一看,瞧一瞧! ...

  9. Entity Framework的启动速度优化

    最近开发的服务放到IIS上寄宿之后,遇到一些现象,比如刚部署之后,第一次启动很慢:程序放置一会儿,再次请求也会比较慢.比如第一个问题,可以解释为初次请求某一个服务的时候,需要把程序集加载到内存中可能比 ...

  10. 主攻ASP.NET.4.5 MVC4.0之重生:Entity Framework生成实体类步骤(十三)

    1.新建一个ASP.NET MVC 4.0 项目 2.安装Entity Framework Power Tools 3.Entity Framework- -RepositoryReverse Eng ...

最新文章

  1. mysql 集群 增加服务器_MYSQL集群服务配置
  2. python functools.wraps functools.partial实例解析
  3. java中label数值_java – 如何在JLabel中显示变量值
  4. 如何理解虚表及其计算含虚函数的类的大小
  5. jooq 配置oracle_jOOQ配置
  6. jQuery框架总体分析
  7. 脚本学习python和linux-shell和jQuery(javascript)
  8. 教你如何与电脑病毒打游击
  9. 使用vagrant快速创建Linux(centos/7)
  10. 动态规划(Dynamic Programming)理论篇
  11. Python二维码应用(一)QRcode二维码生成识别
  12. creo绘图属性模板_creo绘图属性
  13. ATTCK v12版本战术介绍持久化(三)
  14. 速通C语言支线第一站 基础刷题
  15. 【操作系统】主存空间的分配和回收
  16. CSDN如何公开私密博客
  17. 原码、反码、补码、移码的概念及转换
  18. 找工作真的难吗?并不是工作难找,而是自满的人越来越多。
  19. node.js毕业设计安卓移动LYQ电子商城APP(程序+APP+LW)
  20. 微信小程序 - 将 MP4 视频下载保存到用户手机相册(网络路径 / 临时路径)

热门文章

  1. DolphinDB SQL 案例教程
  2. AI换脸必备知识:如何查看显卡型号以及显存大小!
  3. 打破逆境,新型CRM怎样成为华为有赞们营销新增长的关键?
  4. 电力建设行业未来前景如何
  5. [转]Eureka常用配置
  6. 论文分享:PowerTCP: Pushing the Performance Limits of Datacenter Networks
  7. [深度学习概念]·理解NLP的卷积神经网络
  8. 新授粉方式的花授粉算法
  9. Musical Composition Style Transfer via Disentangled Timbre Representations论文阅读
  10. i'm all geared up