EF构建在provider架构之上。当开发者使用C#创建一个LINQ查询时,EF框架引擎会连接一个provider,将它转换成实际的SQL语句,最后发往数据库。任何给定的provider都是连接Entity Framework和一个特定的RDBMS的桥梁。一旦该provider执行了最终的SQL命令,结果就被EF物质化到.NET对象中。Data reader就是为了这个目的。理解EF构建于ADO.NET之上非常重要,因此,EF也使用了诸如connection,command,和data reader的概念。谈到数据持久化,也就是插入,更新和删除功能,插入时,开发者将一个实体类的实例添加到数据库上下文中。相似地,之前添加到上下文中的实例被标记为changed或deleted,就会产生对数据库即将执行更新和删除的语句。EF会检查上下文中的每个对象,再次使用provider来创建RDBMS特定的insert,update,或delete命令。
Entity Framework建模和持久化EF依赖概念模型完成工作,首先来理解一下什么是Entity Data Model(EDM)以及EF如何使用它管理数据库操作。
理解EDM概念数据模型是EF的核心。要使用EF,我们必须创建概念数据模型,即EDM。EDM定义了我们的概念模型类,这些类之间的关系,以及这些模型到数据库模式之间的映射。
一旦创建了EDM,我们就可以对概念模型执行所有的CRUD操作,EF会将所有的这些对象查询翻译成数据库查询(SQL)。一旦这些查询执行了,EF就会将返回的结果转成概念模型对象实例。EF会使用存储在EDM中的映射信息来执行对象查询到SQL查询,以及相关的数据到概念模型的翻译。
一旦EDM准备就绪,我们就可以使用模型对象来执行CRUD操作。要能够执行CRUD操作,我们必须使用ObjectContext类。接下来让我们理解一下这个类。
理解ObjectContext类一旦我创建了EDM,我就有了应用程序中可以使用的所有的实体。然而,我还需要一个东西来让我在这些实体上执行各种操作。它就是EF中的ObjectContext类。
ObjectContext类是EF中的主要对象。它负责:
ObjectContext类可以理解成管理EDM中所有实体的东西,让我们为这些实体执行所有的数据库操作。当我们想要保存一个新的或者更改的对象到数据库时,我们必须调用ObjectContext类中的SaveChanges方法。
还有另一个类DbContext,它和ObjectContext类很相似。实际上,Dbcontext类就是ObjectContext类的封装类。它是一个更新的API,而且它提供了更好的API来管理数据库连接和执行CRUD操作。
因为DbContext是更好的API,所以我们会使用DbContext来执行所有的数据库操作。
主要的好处就是:如果数据库已经存在了,那么只需要花一点时间就可以编写数据访问层。EDM可以从数据库中生成,然后根据需求更改EDM。
一些场景:
和Database First相似,Model First最终以EDM结束。使用该EDM,我们可以创建概念模型和数据库。使用这种方法的唯一原因就是我们真的想要使用视觉实体设计器。
Code FirstCode First对于所有的业务逻辑以类实现,并且数据库只用作这些模型的持久化机制时很有用。
选择Code First的一些原因:
上面介绍了三种选择,至于选择哪一种,这也是个不大不小的问题,那么请参考下面进行决定:
方法一:工作流决定树 方法二:检查清单场景 方式
有遗留的数据库或者数据库已经存在 Database First
在开始开发前,我们会获得DBA创建的数据库 Database First
数据库频繁改变,应用程序应该随之改变 Database First
我们想要使用视觉实体设计器来生成数据库和模型类 Model First
我们已有模型类并且只需要数据库保存数据 Code First
我们想要编写所有的模型类,实现这些类,然后考虑数据库存储 Code First
我们不想处理自动生成的类,且更喜欢动手亲自编写 Code First
本章小结这一节我们看到了传统的嵌入式sql访问数据的短处,并理解了什么是ORM以及ORM主要解决的问题。同时,我们回顾了一下Entity Framework的历史发展,也看到EF能做什么。我们也简要地看了一下EF的架构。然后理解了什么EDM,ObjectContext,以及它和DbContext的区别和联系。随后我们介绍了EF的三种开发方式(也叫EF工作流)和它们之间的比较,以及使用它们的可能场景,最后介绍了如何选择哪一种方式。
自我测试点击查看答案默认您已支持本文
查看答案
参考书籍:
《Mastering Entity Framework》
《Code-First Development with Entity Framework》
《Programming Entity Framework Code First》