EF

来源:互联网 发布:cgi python 编辑:程序博客网 时间:2024/04/30 20:15

EF作用
    ADO.NET的连接层和断开连接层提供了一个架构,可以通过连接、命令、数据读取器、数据适配器和dataset对象来进行查询、插入、更新和删除数据等操作。尽管这是一个十分优秀的架构,但他还是会迫使我们以一种与物理数据库结构紧耦合的方式来处理数据。例如在使用连接层时,我们通常在数据读取器中指定列名来便利每天记录。而如果使用断开连接层,则将会对dataset容器中的datatable对象的行列集合进行遍历
    如果在断开连接层中使用强类型的dataset或数据适配器,那么带来的编程方面的抽象性是很有帮助的。首先,强类型的dataset使用类的属性来表示表数据。其次,强类型的表适配器支持封装了构造底层SQL语句的方法。

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