重新认识了下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官网

 

转载于:https://www.cnblogs.com/Erik_Xu/p/6017144.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30765475/article/details/95694797

智能推荐

coredump配置、产生原理、分析及示例-程序员宅基地

文章浏览阅读5.7k次,点赞4次,收藏26次。coredump配置、产生、分析以及分析示例关键词:coredump、core_pattern、coredump_filter等等。应用程序在运行过程中由于各种异常或者bug导致退出,在满足一定条件下产生一个core文件。通常core文件包含了程序运行时内存、寄存器状态、堆栈指针、内存管理信息以及函数调用堆栈信息。core就是程序当前工作转改存储生成的一个文件,通过工具分析这个文件,可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题点并解决。配置coredump如果需要使用需要通过ul_coredump

方法参数_spades中的默认参数-程序员宅基地

文章浏览阅读397次。按…调用(call by…)java总是按值调用的。方法得到的参数只是一个拷贝,方法不能修改参数变量的内容。然而,方法参数有两种数据类型:1,基本数据类型2,对象引用方法得到的是对象应用的一个拷贝,拷贝同时引用同一个对象,所以这时能够改变对象的属性..._spades中的默认参数

Qt 多页面切换stacked widget控件_qt 页2的控件移到页1-程序员宅基地

文章浏览阅读6.4k次,点赞10次,收藏22次。Qt 多页面切换stacked widget控件stacked widget 支持多页面切换的_qt 页2的控件移到页1

怎么把旧iPhone上的备份迁移到新iPhone上?_苹果倒资料到苹果-程序员宅基地

文章浏览阅读8.8k次。一、通过iPhone的【设定新的iPhone】程序转移数据先看看自己上一部iPhone手机的系统是否为ios11及以上,如果是可以通过苹果官方设计的【设定新的iPhone】这一程序,当然如果不是升级一下系统即可,能帮你把上一个iPhone里面的资料以及手机的设置直接转移到新的手机上,不过还是需要先连网下载备份才可以实现。这一程序是全自动的,所以你只需要在买iPhone开机的时候,把旧iPhone的蓝牙以及WiFi打开,新的手机就会自己匹配。此时你只要打开旧iPhone的相机扫描新的iPhone屏幕上显示_苹果倒资料到苹果

matlab 阿伦方差,GitHub - XinLiGH/GyroAllan: 陀螺仪随机误差的 Allan 方差分析-程序员宅基地

文章浏览阅读1k次。GyroAllan陀螺仪随机误差的Allan方差分析陀螺仪的随机误差主要包括:量化噪声、角度随机游走、零偏不稳定性、角速率随机游走、速率斜坡和正弦分量。对于这些随机误差,利用常规的分析方法,例如计算样本 均值和方差,并不能揭示出潜在的误差源。另一方面,在实 际工作中通过对自相关函数和功率谱密度函数加以分析将随机误差分离出来是很困难的。Allan方差法是20世纪60年代由美国国家标准局的David ..._allan分析 matlab

程序员必看:如何处理突发的程序故障?_程序故障调查-程序员宅基地

文章浏览阅读908次。在互联网公司中,大家常提到的是用代码“改变世界”的开发人员。其实,产品上线和维护,除了开发,还有一个岗位也肩负着重要责任。他们随时待命,遇到系统故障要立马解决,还要为项目上线、维护、更新等重大事情提供IT资源,让产品能如期运转。他们就是运维工程师,就像急诊科医生一样,总是临危受命,抢救项目于水火。但这种临危不乱,快速解决问题的技能并非人人都会的。在未来,IT岗位越来越需要综合..._程序故障调查

随便推点

Android根据图片path转成Uri,分享图片_uri.pa-程序员宅基地

文章浏览阅读3.1k次。先给出代码:通过uri.fromfile()方法将图片path,转化为uri,然后送给EXTRA_STREAM,实现分享//分享 Uri pa=Uri.fromFile(new File(filePath));//根据路径转化为uri Intent imageIntent = new Intent(Intent.ACTION..._uri.pa

Android Edittext详解_android windowmanager edittext-程序员宅基地

文章浏览阅读498次。android:password=”true”老版本时,我们常用此来实现输入是密码。后来此方法过期了。Android推出了新的方法实现。android:inputType=”textPassword”现在google推荐使用这个方法了。inputType属性释义android:inputType=”none” android:inputType=”text”文本 android:inputTyp_android windowmanager edittext

开源基于CAN总线的Bootloader/IAP,含上位机及单片机源码-程序员宅基地

文章浏览阅读7.8k次,点赞5次,收藏34次。开源基于CAN总线的Bootloader/IAP,含上位机及单片机源码http://openedv.com/forum.php?mod=viewthread&amp;tid=90463&amp;highlight=IAP_基于can总线的bootloader/iap

linux摄像头V4L2 subdev,linux摄像头I2C驱动初始化-程序员宅基地

文章浏览阅读418次。阅读linux的ov2655的驱动程序时,并没有发现I2C设备驱动的初始化函数i2c_add_driver,只是定义了static struct v4l2_i2c_driver_data v4l2_i2c_data ={.name = S5K4BA_DRIVER_NAME,.probe = ov2655_probe,.remove = __devexit_p(ov2655_remove),.id_..._linux下v4l2初始化

csr8670--sink工程的大致工作流程分析(以speaker为例)一_connection_flag_scom_enable-程序员宅基地

文章浏览阅读1.3w次,点赞5次,收藏37次。今天是14号 15号更新,说明,刚开始看程序有点复杂 没办法,必须看代码 建议首先先把ADK3.5.1中的例程tutorials看完,对学习很有帮助1.csr中的消息机制1.1 adk3.5.1中的led的例子csr8670中是以消息机制进行任务调度的,根据消息调用相应的回调函数进行处理,如下面这个例子所示:在主函数中,首先设置PIO为输出并且设置为低电平,然后调用了messagesend函_connection_flag_scom_enable

PyMacroParser 宏解析工具_svmacroparser-程序员宅基地

文章浏览阅读1k次。PyMacroParser 宏解析工具PyMarcoParser宏解析工具题目要求题目描述示例解题思路1.load函数2.preDefine函数3.dumpDict函数4.dump函数关键代码1.主要函数2.关键函数PyMarcoParser宏解析工具题目要求题目描述假定有CPP 源码文件(.cpp) 仅有如下内容包含C/C++ 风格的注释: // 及 /**/包含空白字符只包含 ..._svmacroparser

推荐文章

热门文章

相关标签