EF
来源:程序员人生 发布时间:2015-03-21 09:13:45 阅读次数:4407次
EF作用
ADO.NET的连接层和断开连接层提供了1个架构,可以通过连接、命令、数据读取器、数据适配器和dataset对象来进行查询、插入、更新和删除数据等操作。虽然这是1个10分优秀的架构,但他还是会迫使我们以1种与物理
数据库结构紧耦合的方式来处理数据。例如在使用连接层时,我们通常在数据读取器中指定列名来便利每天记录。而如果使用断开连接层,则将会对dataset容器中的datatable对象的行列集合进行遍历
如果在断开连接层中使用强类型的dataset或数据适配器,那末带来的编程方面的抽象性是很有帮助的。首先,强类型的dataset使用类的属性来表示表数据。其次,强类型的表适配器支持封装了构造底层SQL语句的方法。
相比更新
数据库时使用1些SQL查询来查找、更新,再将其发送回
数据库进行处理,使用ef可以简单地修改对象的属性,并保存其状态。ef在运行时将自动更新
数据库。
实体的作用:
前面说到强类型类成为实体。实体是将无力
数据库映照到业务领域的概念模型。这类模型的正式名称为实体
数据库模型(EDM)。它是1组映照到无力
数据库的客户端类,但是这些实体没有必要与
数据库架构的命名约定完全1致。你完全可以根据需要调剂实体类,ef运行时将把这些唯1的名字映照到正确的
数据库架构。
(大多数情况,客户端实体类的名称都与关系型
数据库表名相同。但你总是可以修改它的名称使其与业务环境更符合)
EF基础:
EF API 和其他的ADO.NET 交互方式1样,ef使用1个ado.net 数据提供程序来与数据存储进行交互。所不同的是,在恩你个狗与ef api 交互之前,必须更新数据提供程序使其支持新的服务。除微软SQLserver数据提供程序增加了必要的内容之外,system.data .entity .dll 程序集还包括了各种命名空间来解释EF服务本身。EF API的两个关键部份为
对象服务 和 实体客户端。
对象服务的作用:
对象服务是ef的1部份,他在代码中对客户端进行控制。例如,对象服务跟踪你会实体的更改、管理实体间的关系并提供将更改保存到
数据库的方法,和用xml或2进制序列化服务队实体状态进行持久化的方法。
就编程而言,对象服务层对所有扩大entityObject积累的类进行管理
实体客户真个作用:
EF API 的另外一个主要部份是实体客户端层,她使用基本的ado.net 数据提供程序来建立
数据库连接、基础实体状态和linq 查询生成sql语句、将
数据库数据映照到实体,和处理其他其他在不使用ef经常见的细节问题。
*.edmx文件的作用
为了使entityframework api能够将实体类数据正确映照到
数据库表数据,你需要定义适当的映照逻辑。在所有的数据模型驱动的系统中,实体、真实的
数据库和映照层都会被划分为3个相干的部份:概念模型、逻辑模型和物理模型。
概念模型:实体和她们呢之间的关系
逻辑模型:将实体和关系(通过外键束缚)映照到表
物理模型:通过指定的存储细节(如表架构、表分割和索引)来表示特定的数据引擎的能力。
在ef中,这3层均寄存在基于xml格式的文件里。当使用vs集成的ef设计器时,会得到1个以*.edmx 为扩大名的文件(EDM为entity data model)。该文件包括实体、物理数据库的xml描写,并且介绍了如何在概念模型和物理模型之间映照这些信息。
当使用visual studio编译基于EF项目时,*.edmx 文件将生成3个独立的文件:用于概念模型数据的*.csdl 、用于物理模型的*.ssdl 和用于映照层的*.msl .然后这3个基于xml的文件将以2进制资源的情势绑定到利用程序中。编译以后,.NET 程序集中将包括代码库中所调用的ef
api的所有必要的数据。
ObjectContext和ObjectSet <T>类的作用
ef的最后1个难点是objectContext类,它是system.Data .Objects 命名空间的1员。在生成*.emdx 文件时,你将得到映照到数据库表的实体类和1个继承自ObjectContext的类。该类通经常使用于对象服务与实体客户端之间的交互。
ObjectContext为自雷提供了大量的核心服务,包括保存所有更新的功能(用于
数据库更新)、调剂连接字符床、删除对象、调用存储进程、处理其他底层细节。
ObjectContext的派生类作为1个容器,管理那些存储在ObjectSet<T>集合中的实体对象。
汇总
上图创建的场景:对上下文的实体编写了1个Linq查询,该查询被传递给对象服务,对象服务将linq命令转换为实体客户端可以理解的树。然后,实体客户端将树转化为ADO.NET提供程序的SQL语句。提供程序返回1个数据读取器(如1个D不DataReader的派生对象),客户端服务使用该读取器(EntityDataReader)将数据传入对象服务。终究C#代码库所得到的是实体
数据库的枚举(IEnumberable<T>)。
还有1种情况,如果你的C#代码库希望对客户端服务创建的发送到
数据库的SQL语句进行更多地控制,你可以编写C#代码直接将Entity SQL传递给实体客户端或对象服务。终究得到的也是1个IEnumberable<T>。
这两种情况下,你都必须使得客户端服务理解*.edmx文件中的xml数据,即如何将
数据库院子映照到实体。最后要记住的是,客户端(C#代码库)还可使用EntityDataReader直接从实体客户端获得数据。
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠