实体数据模型(EDM)在你的程序与数据存储之间架起了一座桥梁。它为你提供了操作数据的概念视图而不是数据库模式的能力。实体框架提供的.NET API与数据存储的每一次交互中使用EDM:不管是检索还是保存数据。实体框架工具根据这个模型生成类,这样你就可以操作EDM所描述的对象了。
在本章,你将通过实体数据模型向导创建一个简单的EDM,然后你既可以在设计器也可以通过浏览原始XML来查阅此模型。本章坚持涉及模型的基础内容以便你能熟悉EDM的结构是怎样的,以及那些常见的元素彼此之间、或与你的代码、数据库如何相联系的。
在第14章中,将探讨EDM更复杂的方面,比如它不同的派生能力以及如何定制模型以便它们能更好的反映你的业务逻辑。
为什么使用实体数据模型(EDM)?
设计良好的数据库却又给开发人员带来了一个问题.
在数据领域里,设计数据库出于可维护性,安全,有效性以及可扩充性的考虑。它的数据会以一种满足一定良好数据库的设计要求而组织,然而却给那些需要访问这些数据的开发人员带来了挑战。
注:实体数据模型是一个概念。实体框架有一个特殊的实现,在设计时以EDMX文件实现。而运行时EDMX文件会被分成3个独立的XML文件。为了保持清晰,本书在讨论实体框架的具体实现时,简单引用EDM或者实体数据模型(亦或“该模型”)这种称谓。但要牢记EDM字面上指的是用某种类型的模型代表一个你的程序中的实体这一概念。
EDM遵循第1章所讨论的实体关系建模的概念,但是在实体框架(EF)里,它把模型移到了实体框架运行时所使用的XML文件中。
有了EDM开发人员就可以重点关注他们的业务对象,甚至当从数据库中检索数据或者持久化回数据库时。作为开发人员的你不必再担心数据库的结构、表名或视图名、存储过程的名字及它所需要的参数。你不必创建必要的对象与数据库作连接,也不必关心返回数据的模式并把结果转换成你的代码要使用的对象。
你只需操作概念模型以及代表那些模型实体的类。当你在实体框架的范围内做这些时,实体框架运行时会处理数据库的连接、数据库命令生成、查询的执行、对象的组织以及将所作变动持久化回数据库所需的细节工作。
实体框架里的EDM
在实体框架的EDM实现中,主XML文件代表着概念模型,它是真正的EDM。第二个XML文件代表数据库模式,而第三个代表前两个之间的映射。在设计期间,这三个文件被捆绑为一个单一的EDMX文件。构建过程会把EDMX拆分成由运行时使用的这三个元数据文件。实体框架然后为开发人员提供一个框架用来书写基于该模型的.NET应用程序。
注:在第25章中,你将会了解到XML模式的替代,这个包含在微软将来的技术将会增强实体框架。
只要EDM提供了概念模式、数据库表示、映射文件以及能够访问实体框架所感知的目标数据库的ADO.NET提供程序,实体框架就不必再关心是什么样的目标数据库了。它提供了一个通用的与数据库交互的方式,通用的查询语法,通用的发送修改到数据库的方法。
虽然实体框架为开发人员提供了一套丰富的特性集,但是它最重要的能力如下:
- 默认情况它自动根据模型产生类,并且每当模型变动时都会自动更新这些类
- 它负责管理全部数据库的连接,所以开发人员不用再写大量的数据库交互代码。
- 它提供了通用的查询语法用于查询模型而不是数据库,然后把这些查询转换成数据库可以理解的查询。
- 它提供了一种机制用于追踪程序中使用的模型对象所作的修改,并处理到数据库的更新。
另外,由于模型的类是动态生成的,所以对模型的微小变化都不需要对你的应用程序有较大的影响。另外,修改模型要比修改你的对象以及它们所依赖的数据访问代码要简单的多。
本书你所做的全部工作都依赖于一个EDM,所以请准备好这个,我们会创建一个简单的模型,然后由此详细展开以便你能对实体框架具体工作方式有彻底的理解。
轻轻松松构建你的第一个EDM
让我们根据这个样例数据库ProgrammingEFDB1开始创建一个模型吧.这是一个简单的数据库:只有两个表、一个视图和几个存储过程,因此很适合入门使用。有了EDM,你就能够浏览a它的元素和它们的关系,这些我们将在本章后面涉及。
注:本节walkthrough将会使用一个自定义的SQL Server 数据库ProgrammingEFDB1,你可以从本书的网站http://www.learnentityframework.com下载。Visual Studio 2010提供了SQL Server的实体框架连接。在第一章提到过,你可以安装其它的提供程序以便连接到其它数据库,例如SQL Server CE,MySQL,Oracle和VistaDB.
1.通过选择“控制台应用程序”项目模版创建一个新的控制台应用程序项目(见图2-1).我起的名字是Chapter2ConsoleApp.
注:确保此项目是一个.NET 4框架的项目。你可以看到新建项目窗口顶部的过滤选项。本书的很多特性都不能用在.NET 3.5,你可能很迷茫。
图2-1 新建一个“控制台应用程序”项目
2.通过右击解决方案浏览器中的Chapter2ConsoleApp单击“添加”然后点“新建项”增加一个新的项。
3.从模版列表中选择ADO.NET实体数据模型(ADO.NET Entity Data Model),然后单击添加(Add)(参见图2-2)。
4.在“选择模型内容(Choose Model Contents)”页,选择“从数据库产生(Generate from Database)”选项,然后单击下一步(Next)。
5.在“选择你的数据连接(Choose Your Data Connection)”页,从可用的连接下拉列表中选择ProgrammingEFDB1。
注:如果在Visual Studio里你没有找到这个ProgrammingEFDB1的数据库连接设置,请单击新建连接并打开连接属性对话框,创建一个到此数据库的新连接。
图2-2 在“添加新项目”页面选择ADO.NET实体数据模型来创建一个EDM
6.在该页面底部,修改默认较长的”ProgrammingEFDB1Entities的连接设置名为SampleEntities,然后单击“下一步”。
7.在“选择你的数据库对象”页面,勾选Tables和Views节点。这样会选择数据库中全部的表和视图。你也可以展开任意节点指定你想要的对象。这个数据库有2个表(Contact和Address),一个视图(vOfficeAddresses)以及6个存储过程。对于本演示示例,只需要这些表和视图。
注:现在我们跳过了存储过程复选框;我们将在第7章再涉足存储过程。
8.在该页的底部,把模型默认的名称空间改为SampleModel,与连接设置的名字保持协调。
9.单击“完成”。
新的模型将会显示在设计器窗口中,而他的文件Model1.edmx会出现在解决方案管理器中(见图2-3)。
图2-3 Model1.edmx被添加到项目中,模型自动在设计器里打开
注:从Visual Studio 2010开始,实体框架也支持model-first设计,这样你可以先从零开始构建一个模型,然后基于这个模型来创建数据库。我们会在第25章里讨论model-first设计。