论文部分内容阅读
摘要:该文主要研究了微软的Entity Framework是如何工作的,以及Entity Framework实现的三种方法,并且为不同的场景该如何选择哪种方法做了一些讨论。还论述了LINQ to Entities如何查询实体数据模型和Entity SQL如何去查询实体数据模型。
关键词:ORM 实体对象;数据模型;Entity Framework
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)10-0013-02
1 概述
Entity Framework是微软公司开发的对象关系映射工具(Object Relational Mapper简称ORM),他实现业务模型和关系型数据之间的相互映射。开发人员基本可以在不使用底层代码的情况下实现数据访问(data access)。Entity Framework给开发人员提供了一套易于理解的基于模型的系统,它可以将开发人员从编写数据访问层和域模型相同的代码的工作中解脱出来。Entity Framework的最初是随着.NET Framework 3.5 SP1和Visual Studio 2008 SP1一起发布的,名称为Entity Framework 3.5,目前的最新版本是Entity Framework 7。
Entity Framework可以非常容易的将概念模型的实体和关系生成数据访问层。应用程序可以非常容易的执行CRUD(create,read,update,delete)操作,以及实体间的一对一、一对多和多对多的关系。Entity Framework还有很多好处,比如:可以比ADO.NET进行数据访问更加快捷,可以通过高级程序语言(C#等)来编写数据访问逻辑等。Entity Framework与数据库的访问最终还是通过ADO.NET来完成的。
2 理解实体对象模型
概念数据模型是Entity Framework的关键。为了使用Entity Framework,我们必须创建概念数据模型实体对象模型(Entity Data Model,简称EDM)。EDM定义了模型类、类和类之间的关系以及模型和数据库图表的映射。
EDM一旦被创建,就可以执行对概念模型执行CRUD的操作,该操作将对象查询装换为数据库查询。查询后的结果将通过Entity Framework再一次装换为概念模型。Entity Framework将实体对象查询和数据库查询的转换关系,关系型数据和概念模型的映射关系存储在EDM中。
3 理解ObjectContext类
EDM被准备后,我们可以对对象模型执行CRUD操作。这种操作需要使用ObjectContext类。ObjectContext类是Entity Framework的主要对象。ObjectContext负责管理在EDM中的实体。这个类主要负责:1)管理数据库的连接;2)对CRUD操作提供支持;3)跟踪对象模型使其更新到数据库,ObjectContext类中的SaveChanges方法可以将新的或者改变的对象保存到数据库。
还有另外一个类名为DbContext非常类似于ObjectContext类。DbContext类只是对ObjectContext类的一个包裹器。ObjectContext不是最新的类,DbContext类对于数据库连接的管理和执行CRUD操作都是较好的API。
4 Entity Framework的开发风格
一些项目的开发都是分为数据库和应用程序两个开发部分,通常首先设计数据库,完成后才开始应用程序的开发。但是根据需求分析的要求,应用程序的开发通常都是要求首先建立概念域模型,数据库的表的建立是通过概念域模型来建立的,最后应用程序将实现响应的业务逻辑。还有一种可能性是,创建的应用程序是高度以领域为中心,域模型通过类来实现,数据库只是用来维持这些模型的关系。
Entity Framework提供了对以上场景的不同的支持。可以将其分为三种不同的方法。1)数据库优先(DataBase First);2)代码优先(Code First);3)模型优先(Model First)。应该根据具体开发场景的分析,权衡选择哪一种方法。
4.1 数据库优先
数据库优先的方法,主要好处是一旦数据库被创建好了,开发人员将花比较少的时间来编写数据访问层。EDM能够从数据库来创建,并且可以根据程序的需要来改变。满足的使用数据库优先的条件有:1)数据库已经创建完成了,或者在已有的数据上进行开发;2)应用程序是以数据为中心的,应用程序的改变是否基于数据库频繁的改变而改变。
4.2 代码优先
代码优先的方法通常被用于业务逻辑类已经被建立好了,数据库只是简单的被用来提供数据持久的作用。满足的使用代码优先的条件有:1)模型类已经创建好了,只是想通过数据库来进行数据的持久化;2)需要完成模型类之后才考虑是否需要将数据存储到数据库;3)开发人员不喜欢生成类而更加偏爱编写类。
4.3 模型优先
模型优先的方法,可以创建概念模型来创建数据库,之所以使用这种方法的原因是:在Visual Studio中使用模型优先的方式可以通过Visual Entity Designer来进行EDM的创建。
5 通过LINQ to Entities查询实体数据模型
LINQ(Language-Integrated Query)是.NET Framework中的数据查询技术。LINQ to Entities是对应用程序使用LINQ去指定需要获得的数据的实体对象模型作了一个良好的抽象,LINQ to Entities提供者负责处理访问数据库和为应用程序获取需要的数据。当应用程序使用LINQ to Entities去执行LINQ查询实体数据模型,LINQ首先在编译时决定需要获取哪些数据,然后,它将被执行,结果返回为CLR对象。然而,如果想理解整个过程,关键是理解被执行的查询和获取.NET对象的结果。 大体的查询过程是:应用程序创建LINQ查询;LINQ to Entities依赖能够工作在Entity Framework概念对象模型的EntityClient,使用Entity Framework的对象实体模型将EntityClient命令转换为SQL查询;SQL查询通过ADO.NET被传递到数据库;在数据库中执行查询;查询结果返回到Entity Framework;Entity Framework将结果转换为CLR类型域实体;EntitiyClient将使用投影将需要的结果返回给应用程序。
6 通过Entity SQL查询对象模型
Entity SQL(ESQL)提供了类似于SQL的语法,可以去编写针对模型类而不是针对数据表的查询。虽然,当涉及实体数据模型的查询时ESQL是一个很少使用技术,但是,当涉及对数据模型执行动态查询时它却十分有用。另一个使用ESQL的好处是开发人员只需要知道实体数据模型的架构,而不需要知道数据库的架构。如果开发人员比较熟悉SQL语言,那么使用ESQL将是十分容易的事情。
如果开发人员使用ObjectQuery去编写ESQL,查询将被执行在对象层,也就是ESQL将获得实体模型。相比之下,如果开发人员使用EntityCommand去编写ESQL,查询将执行EntityClient,会获得只读的数据行集合。
7 总结
本文讨论了ORM和通过ORM轻松地完成数据访问代码。并讨论了Entity Framework是如何工作的,以及Entity Framework实现的三种方法,并且为不同的场景该如何选择哪种方法做了一些讨论。还阐述了LINQ to Entities如何查询实体数据模型和Entity SQL如何去查询实体数据模型。还了解了Entity SQL在ObjectQuery和EntityCommand两种情况下获得数据的方式。本文只是对Entity Framework常用特性作了概述,由于篇幅所限,没有对Entity Framework进行代码举例,还有一些高级特性,诸如并发管理和事务管理等知识未涉及到。既是对知识的拾遗也为抛砖引玉之用。
参考文献:
[1] 百度百科.Entity Framework [EB/OL].http://baike.baidu.com/link?url=bEeKvfk_9KDdiPnZkjAHQlrkRKa6ls_fzakDi-Gqbs _HLddRw9GoSypehKGoSypehKNP2sGzRqjWetV3Mr W2K.
[2] 詹姆斯. ADO.NET 3.5高级编程:应用LINQ
关键词:ORM 实体对象;数据模型;Entity Framework
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)10-0013-02
1 概述
Entity Framework是微软公司开发的对象关系映射工具(Object Relational Mapper简称ORM),他实现业务模型和关系型数据之间的相互映射。开发人员基本可以在不使用底层代码的情况下实现数据访问(data access)。Entity Framework给开发人员提供了一套易于理解的基于模型的系统,它可以将开发人员从编写数据访问层和域模型相同的代码的工作中解脱出来。Entity Framework的最初是随着.NET Framework 3.5 SP1和Visual Studio 2008 SP1一起发布的,名称为Entity Framework 3.5,目前的最新版本是Entity Framework 7。
Entity Framework可以非常容易的将概念模型的实体和关系生成数据访问层。应用程序可以非常容易的执行CRUD(create,read,update,delete)操作,以及实体间的一对一、一对多和多对多的关系。Entity Framework还有很多好处,比如:可以比ADO.NET进行数据访问更加快捷,可以通过高级程序语言(C#等)来编写数据访问逻辑等。Entity Framework与数据库的访问最终还是通过ADO.NET来完成的。
2 理解实体对象模型
概念数据模型是Entity Framework的关键。为了使用Entity Framework,我们必须创建概念数据模型实体对象模型(Entity Data Model,简称EDM)。EDM定义了模型类、类和类之间的关系以及模型和数据库图表的映射。
EDM一旦被创建,就可以执行对概念模型执行CRUD的操作,该操作将对象查询装换为数据库查询。查询后的结果将通过Entity Framework再一次装换为概念模型。Entity Framework将实体对象查询和数据库查询的转换关系,关系型数据和概念模型的映射关系存储在EDM中。
3 理解ObjectContext类
EDM被准备后,我们可以对对象模型执行CRUD操作。这种操作需要使用ObjectContext类。ObjectContext类是Entity Framework的主要对象。ObjectContext负责管理在EDM中的实体。这个类主要负责:1)管理数据库的连接;2)对CRUD操作提供支持;3)跟踪对象模型使其更新到数据库,ObjectContext类中的SaveChanges方法可以将新的或者改变的对象保存到数据库。
还有另外一个类名为DbContext非常类似于ObjectContext类。DbContext类只是对ObjectContext类的一个包裹器。ObjectContext不是最新的类,DbContext类对于数据库连接的管理和执行CRUD操作都是较好的API。
4 Entity Framework的开发风格
一些项目的开发都是分为数据库和应用程序两个开发部分,通常首先设计数据库,完成后才开始应用程序的开发。但是根据需求分析的要求,应用程序的开发通常都是要求首先建立概念域模型,数据库的表的建立是通过概念域模型来建立的,最后应用程序将实现响应的业务逻辑。还有一种可能性是,创建的应用程序是高度以领域为中心,域模型通过类来实现,数据库只是用来维持这些模型的关系。
Entity Framework提供了对以上场景的不同的支持。可以将其分为三种不同的方法。1)数据库优先(DataBase First);2)代码优先(Code First);3)模型优先(Model First)。应该根据具体开发场景的分析,权衡选择哪一种方法。
4.1 数据库优先
数据库优先的方法,主要好处是一旦数据库被创建好了,开发人员将花比较少的时间来编写数据访问层。EDM能够从数据库来创建,并且可以根据程序的需要来改变。满足的使用数据库优先的条件有:1)数据库已经创建完成了,或者在已有的数据上进行开发;2)应用程序是以数据为中心的,应用程序的改变是否基于数据库频繁的改变而改变。
4.2 代码优先
代码优先的方法通常被用于业务逻辑类已经被建立好了,数据库只是简单的被用来提供数据持久的作用。满足的使用代码优先的条件有:1)模型类已经创建好了,只是想通过数据库来进行数据的持久化;2)需要完成模型类之后才考虑是否需要将数据存储到数据库;3)开发人员不喜欢生成类而更加偏爱编写类。
4.3 模型优先
模型优先的方法,可以创建概念模型来创建数据库,之所以使用这种方法的原因是:在Visual Studio中使用模型优先的方式可以通过Visual Entity Designer来进行EDM的创建。
5 通过LINQ to Entities查询实体数据模型
LINQ(Language-Integrated Query)是.NET Framework中的数据查询技术。LINQ to Entities是对应用程序使用LINQ去指定需要获得的数据的实体对象模型作了一个良好的抽象,LINQ to Entities提供者负责处理访问数据库和为应用程序获取需要的数据。当应用程序使用LINQ to Entities去执行LINQ查询实体数据模型,LINQ首先在编译时决定需要获取哪些数据,然后,它将被执行,结果返回为CLR对象。然而,如果想理解整个过程,关键是理解被执行的查询和获取.NET对象的结果。 大体的查询过程是:应用程序创建LINQ查询;LINQ to Entities依赖能够工作在Entity Framework概念对象模型的EntityClient,使用Entity Framework的对象实体模型将EntityClient命令转换为SQL查询;SQL查询通过ADO.NET被传递到数据库;在数据库中执行查询;查询结果返回到Entity Framework;Entity Framework将结果转换为CLR类型域实体;EntitiyClient将使用投影将需要的结果返回给应用程序。
6 通过Entity SQL查询对象模型
Entity SQL(ESQL)提供了类似于SQL的语法,可以去编写针对模型类而不是针对数据表的查询。虽然,当涉及实体数据模型的查询时ESQL是一个很少使用技术,但是,当涉及对数据模型执行动态查询时它却十分有用。另一个使用ESQL的好处是开发人员只需要知道实体数据模型的架构,而不需要知道数据库的架构。如果开发人员比较熟悉SQL语言,那么使用ESQL将是十分容易的事情。
如果开发人员使用ObjectQuery去编写ESQL,查询将被执行在对象层,也就是ESQL将获得实体模型。相比之下,如果开发人员使用EntityCommand去编写ESQL,查询将执行EntityClient,会获得只读的数据行集合。
7 总结
本文讨论了ORM和通过ORM轻松地完成数据访问代码。并讨论了Entity Framework是如何工作的,以及Entity Framework实现的三种方法,并且为不同的场景该如何选择哪种方法做了一些讨论。还阐述了LINQ to Entities如何查询实体数据模型和Entity SQL如何去查询实体数据模型。还了解了Entity SQL在ObjectQuery和EntityCommand两种情况下获得数据的方式。本文只是对Entity Framework常用特性作了概述,由于篇幅所限,没有对Entity Framework进行代码举例,还有一些高级特性,诸如并发管理和事务管理等知识未涉及到。既是对知识的拾遗也为抛砖引玉之用。
参考文献:
[1] 百度百科.Entity Framework [EB/OL].http://baike.baidu.com/link?url=bEeKvfk_9KDdiPnZkjAHQlrkRKa6ls_fzakDi-Gqbs _HLddRw9GoSypehKGoSypehKNP2sGzRqjWetV3Mr W2K.
[2] 詹姆斯. ADO.NET 3.5高级编程:应用LINQ