技术(1)EF实体框架(一)

来源:互联网 发布:老人 音乐软件 编辑:程序博客网 时间:2024/06/05 23:45

引言

           EF实体框架——你知道多少?宏观的学习和细致的深入,决定你成功的高度。

概述

           EF实体框架是ADO.NET中的一组支持开发面向数据的软件应用程序技术,是微软的一个ORM框架。这个概念你理解了吗?当然没有,确实很难理解,不过没事我们有简单的说法:EF实体框架是ORM思想的一个具体实现,ORM(Object—Relation—Mapping)照着英文直接理解为对象关系映射框架,恭喜你猜对了正是这个框架,不过ORM还叫数据持久化框架,了解即可。

内容

          下面来说EF的具体内容,先来幅图了解一下全局,不谋全局者,不足谋一域

     

        先对整体内容有一个宏观的把控,然后再深入研究。研究一个知识点,三步式我们都做的到:是什么?做什么?怎么做?不要忘记了多走一步——扩展。

         一 是什么?

              EF实体框架是什么,具体说就是一个框架。来源ORM,概念在概述里面叙述了,这里不再赘述。

         二 做什么?

               第一个问题?那么EF实体框架是用来做什么的哪?第一 用于支持开发人员通过对概念性应用程序模型编程(而不是直接对关系存储架构编程)来创建数据访问应用程序,也就是对实体对象编程,对数据库进行访问。 第二 降低面向数据的应用程序所需的代码量并减轻维护工作。当然还有其他用处,比如创建数据库等。

               第二个问题,使用EF实体框架的优势在哪里?这里要与传统三层进行一下对比。

                      传统三层特点:1 重复的操作数据库代码:使用三层架构,我们使用ADO.NET访问数据库,我们引入一个封装数据库操作的SQLHepler类,但是这里并没有减少我们D层中重复的增、删、改、查操作,这样操作不同的表就需要重复这些操作,是不是有些不尽如人意哪? 2 系统扩展性和灵活性不高:数据访问层同时与域模型和关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,都要修改D层的程序代码,增加了维护的难度和成本。

                      EF实体框架的特点:1 支持多种数据;2强劲的映射引擎,很好的支持存储过程;3  可视化操作;4 能与ASP.NET、WPF、WCF Data Services进行很好的集成;5 面向对象,不用SQL直接编码,就可以向操作对象一样操作数据库;6 提高开发效率,ORM可以自动对实体对象与数据库中Table进行字段与属性的映射,不需要单独的数据访问层; 7 方便转移,当数据库发生改变,不需要对模型进行改动,只需要修改映射关系即可。

                      俩者一对比,尤其是EF实体框架不需要单独的数据访问层,证明了EF存在的优势。EF实体框架的使用场合:1 复杂的系统 2 开发时间紧迫的项目 3 有数据库迁移需求的项目。

         三 怎么做?

                    1 EF实体框架的原理

                       EF实体框架的原理可以用一句话来表达:跟踪表实体的变化,翻译成SQL脚本,并执行到数据库中去,将实体变化映射到数据库变化。也可以用一幅图来形象的表示:

                     

                       当我们通过应用程序对数据库执行CRUD时,通过EF方式,实际上是对ObjectContext的操作,ObjectContext相当于EF的入口,ObjectContext拿到对应的CRUD消息,通过ORM中的Mapping来将对象O映射成数据库关系R,然后再生成相应的SQL语句,对数据库进行访问。

                2 EF实现方式

                        DBFirst:传统的表驱动方式创建实体数据模型(EDM),然后通过EDM生成模型和数据层代码,不仅生成实体模型和自跟踪实现模型,还支持生成轻型DbContext。

                        ModelFirst:先创建EDM,再生成DDL数据库脚本和模型和数据层代码,不仅生成实体模型和自跟踪实现模型,还支持生成轻型DbContext。

                        CodeFirst:代码先行,手动创建数据层DbContext及映射关系,通过Database.SetInitializer生成数据库,这种方式较为灵活,但是代码工作量大,手动写大量的POCO类和映射关系。

                3 数据操作    

                         查询:三种方式:原生SQL语句、Linq表达式、Lambda表达式

                                  (1)原生SQL语句:select * from table1 where <条件>;好处:适用于复杂的查询和报表 ,性能稳定。

                                  (2)Linq表达式:from 临时变量 in 集合对象或者数据库对象(实体) where  条件表达式 [order by 条件] select 临时变量中被查询的值 [group by  条件];好处:编写更少代码即可创建完整应用、更快开发错误更少的应用程序、提高开发者开发效率、数据交互方便。

                                  (3)(参数列表 ) => 表达式或者语句块,其中参数个数范围为0——N,参数类型:可以隐式或者显示定义;好处:简化了代码,增加了类型安全。

                         其他:增、删、改操作,操作过程:先创建一个数据库访问的上下文,然后实例化一个 表实体,对表实体的属性做改变,然后调用上下文的方法,进行数据库交互。例如如下的增加一个实体的操作(其他操作类似,只不过使用方法不一样。):

<span style="color:green;">//所有数据的操作第一就是创建数据库访问的上下文<span style="color:#000000;">            SSEntities dbContext = new SSEntities();</span></span>#region 添加实体            Student stu = new Student();            stu.StudentNo = "12050242012";            stu.StudentName = "李明";            stu.Sex = "男";            stu.Class = "电子二班";            dbContext.Student.Add(stu); //代表往dbContext指向的数据中的Student表中添加一条数据stu            dbContext.SaveChanges();   //真正的保存到数据库#endregion
         四 扩展:

                1 IQueryable接口和其他集合的区别?

                       IQueryable接口存放查询的表达式,元素的类型,查询的驱动Provider,并不存放实际的数据。但是其他集合里面存放的是实实在在的数据。IQueryable称之为离线型集合,执行原理,Provider通过解析表达式,去数据库中查找相应数据,再返回给查询者。其他集合特指数组、List等集合,这些集合是本地集合,在内存中存放真实数据,查询直接查询内存数据。

                2 跨数据库支持?

                       目前流行的数据库基本都支持EF实体框架,例如Oracle、MySQL、SQL等。

问题

          注意问题集锦:1 日期类型不能有默认值;2 一次请求一个上下文实体;3 不能使用单例模式;4 lambda表达式和linq表达式在编译阶段后生成的IL代码(中间代码)一样。

        遇到的问题 :1 为什么dbContext不能点出objectStateManager.ChangeObjectState()的方法? 2 延迟加载具体指什么?

总结

          EF作为一个功能强大的实体框架,应该深入研究,并不能只停留在会用的层次这个时候应该讲究起来,深入研究,颗粒归仓。

0 0