[Programming Entity Framework] 第2章 探究实体数据模型(EDM)(一)
Programming Entity Framework 第二版翻译索引
实体数据模型(EDM)是应用程序和数据存储之间的桥梁。EDM提供了与数据概念视图而不是实际数据库构架工作的能力。EF提供的 .NET API为每个与数据存储的交互使用了EDM,不管它是读取还是保存数据。EF工具从这些模型中生成类,确保你同EDM描述的对象一起工作。
在本章中,你将使用实体数据模型向导创建一个简单的EDM,然后将在设计器和原生XML文件中对其进行检查。这章将忠于模型的基本要素,这样你熟悉EDM的结构及最常见的元素如何与另一个在代码及数据中相关联。
在第14章,你将开始研究EDM最为复杂的方面,例如它与从不同的继承功能及如何自定义能更好反应业务逻辑的模型。
为什么使用实体数据模型?
设计良好的数据能对开发人员提出问题。
在数据的世界里,数据库的设计是为了可维护,安全,高效及可扩展。它的数据以一种能满足好的数据库设计的方式被组织起来,为想要访问数据的开发人员提供挑战。
注:实体数据模型是一个概念。EF在设计阶段有特定的实现,就是EDMX文件。在运行时,EDMX文件被分解为三个独立的XML文件。为了清晰,本书在讨论EF的实现时将简单地涉及EDM或实体数据模型(或简单称为模型)。但是记住EDM字面意思是指使用一些类型的模型表示应用程序中的实体的概念。
EDM遵循在第1章中讨论到的实体关系模型的观点,但是在EF中,它将模型移动到了EF运行时使用的XML文件中。
在恰当的地方使用EDM,开发人员能专注于他们的业务对象,即使是在从数据库读取数据或持久化它到数据库中。你,作为开发人员,不用担心数据的结构,表或者视图的名称,存储过程的名称或者他们要求的参数。你不用创建用于连接数据库的的对象,不用关心返回数据的构架,然后使用代码将它们转化成对象。
你只需要简单地与概念模型和代码模型实体的类工作。当你在EF的范畴里这样做时,EF运行时当处理数据库的连接,数据库命令的生成,查询执行,对象实例化,还有持久化改变回数据库的细节。
EF中的EDM
在EF的EDM实现中,主要的XML文件代表着概念模型,也就是实际的EDM。第二个XML文件代表着数据库构架,第三个表示前两个的映射。在设计阶段,这三个文件都在EDMX文件中。构建过程将EDMX文件隔成用于运行时使用的三个元数据文件。EF然后提供了允许开发人员编写基于此模型的.NET应用程序的框架。
注:在第25章中,你将学习到来自微软的未来技术,它将增强EF,它包含能替代XML构架的替代品。
既然EDM了概念模式,数据库的表示,映射文件,访问EF,注意ADO.NET针对目标数据库的提供程序,EF不关心它的目标数据库是什么。它提供了与数据库交互的通用方式,通过查询语法,发送变化回数据库的通用方法。
尽管EF为开发人员提供了非常丰富的特性,它最重要的功能如下:
-
默认情况下,它自动从模型生成类,并在模型改变的任何时刻动态更新这些类。
-
它照顾所有的数据库连接,这样开发人员不用再负担编写代码与数据库交互。
-
它为查询模型提供通用的查询语法,注意不是数据库。然后将这些查询转化成数据库能明白的查询。
-
它为应用程序中使用的模型的对象提供追踪变化的机制,并处理对数据的更新。
另外,由于模型类动态生成,细微的改变不会对你的应用程序最成很大的影响。此外,修改模型比修改对象和他们依赖的数据访问代码更简单。
你在本书所要做的事情将依赖于EDM,所以为了准备这个,我们将创建简单的模型,然后将它放在显微镜下,这样你将对EF与谁工作有彻底的理解。
演练:创建你的第一个EDM
让我们从一个简单的数据库ProgrammingEFDB1创建模型开始吧。这个简单的数据库只有两个表,一个视图和一些存储过程,因此非常合适起步。有了EDM,你将能够浏览它的元素和它们的关系,这个我们会在这章后面进行。
注:这个演练我们将使用一个自定义的SQL Server数据库ProgrammingEFDB1,你可以从本书的站点下载http://www.learnentityframework.com。VS2010提供了SQL Server的连接。正如第1章提到的,你可以安装其它的提供程序以连接其它的数据库,例如SQL Server CE,MySQL, Oracle和VistaDB。
-
通过选择控制台应用程序工程模板创建一个新的控制台应用程序工程(参见图2-1)。我将它命名为Chapter2ConsoleApp.
提醒:确保项目是.NET 框架4的工程。你可以看到新建工程窗口顶端的过滤菜单。本书中的很多特性在.NET 3.5中都不可用,如果选错了在学习过程中你会让自己非常迷惑。
-
在解决方案浏览器中通过在Chapter2ConsoleApp上右键为它添加一个新项,点击添加,然后单击添加项。
-
在模板列表中选择ADO.NET Entity Data Model,然后单击添加。(参见表2-2)。
-
在选择模型内容页上,选择从数据库生成选项,单击下一步。
-
在选择数据连接页上,在可用的连接下拉列表中选择ProgrammingEFDB1。
注:如果你的VS中没有创建为数据库连接的ProgrammingEFDB1,单击创建连接打开连接属性对话框,然后创建一个新的数据库连接。
-
在这个页的最下面,修改默认的连接设置名称从默认的"PgrammingEFDB1Entities"修改为"SampleEntities",然后单击下一步。
-
在选择你的数据库对象页上,选中表和视图节点。这个将选择数据库中所有的表和视图。同样的,你可以展开任一节点然后选择你想要的特定对象。这个数据库有两个表(Contact和Address),一个视图(VofficeAddress),6个存储过程。对于这个示例,你只需要表和视图。
注:我们暂时跳过存储过程选择框,在第7章中我们会回到存储过程中。
-
在这个页的最下面,修改模型命令空间为"SampleModel",这样就跟连接串的命令一致了。
-
单击完成。
新的模型将显示在设计器窗口上,而在解决方案浏览器中会有它的文件Model1.edmx。如图2-3。
注:使用VS2010开始,EF也支持模型优先的设计,通过它你可以从草稿中创建模型,然后基于此模型创建数据库。我们将在第25章讲到模型优先的设计。
在设计窗口中检查EDM
实体设计器窗口非常的有用,它可以以图解方式查看EDM和它的成员。不然你将不得不面对使自己头晕的大量原生XML,在使用图解方式介绍完之后,本章后面你将有机会做更多的事情。
在通过向导生成模型之后,模型会在设计器视图中打开。如果你关闭了它,你可以通过在解决方案浏览器中用双击EDMX文件的方式再次打开它。设计视图是EDMX文件的默认视图。
设计器如图2-3那样显示了Model1.edmx,它描述了由三个实体组成的EDM,一个Contact实体,一个Address实体和一个VofficeAddress实体。前两个来自于数据库的后,第三个来自于视图。设计器在Contact和Adress之间显示了一条线,它表示着它们之间一对多的关系。每个实体有一系列属性,有着关系的实体额外还有导航属性。
标量属性是实体中值按字面意思来的属性。例如,Contact实体由诸如ContactID,FirstName,LastName和Title这样的东西组成。这些与表的列一致。
导航属性是指向相关实体的。Contact实体有Address属性,它允许应用程序从Contact导航到与此Contact相关的Address集合。Address实体的Contact属性允许你从Address导航到与该Address实体关联的单个Contact。
连接相关实体的线表示关联,它是实体间的关系。注意关系结束的位置,在图2-3中是接近Contact.LastName和Address.StateProvince,它没有特别的意思。关系只是将实体连接起来,它不暗示任何特殊的属性。
导航与关联:谁是谁? 双向的关系通常被描述成为定义多少实体的能成每一端出现的快捷语法。这被称为每端的重数。重数也被称为关系基数,虽然在EF中你不会看到它常用到。 重数选项有: 1(单个) *(多个) 0…1(0或单个) 然后两端被结合起来描述关系。 例如,"1:*"表示"一对多"。一个典型的示例是一张订单和它的多个产品项。 "0…1"表示"0或1对多",这个关系的示例在运货商和订单中间。一个运货商可能运输多个订单,但是也有可能运输一个订单。然而,这个运货商也有可能在一开始没有任何订单。因此,在这个关系中,它可以是0个或一个运货商。 |
注:注意实体拥有像ContactID这样的标量属性,也有被ContactID引用的导航属性Contact。如果你一直与之前版本的EF工作,外键ContactID是新的内容。它是可选的,但是默认情况下它存在。在本章的后面你将阅读到更多关于它的内容。
当与实体设计器工作时,你会在VS IED的属性窗口中看到更多关于容器,每个实体,每个实体属性的信息。
实体容器属性
在模型中实体的逻辑组被称为实体容器。
图2-4展示了实体容器的属性窗口,它的某些属性是折叠的。在此你可以修改窗口的名称和命令空间,定义模型的多元化规则及其它。
实体属性
EDM的每个实体和每个关联,还有模型本身,都有属性。让我们看一下刚刚创建的模型中Contact实体的一些属性。
选择Contact实体查看它的属性窗口(参见图2-5)。
在属性窗口,你可以看到实体不仅有来自数据库表名的名称"Contact",还有实体设置名称属性。如果数据库中的表名是复数,例如Contacts,向导仍然会将命名实体为Contact因为实体名称应该是单数。
实体集合是单个实体的集合的容器。因此,实体集合名称"Contacts"包含Contact实体的集合。默认情况下,向导在创建实体名称时会使用复数化实体名称。你可以在实体数据模型向导中通过不选"在创建对象名称时复数或单数化"来修改这个行为。
实体属性的属性
图2-6展示了Contact的属性FirstName的属性。你能看到,例如,FirstName是不允许为null(Nullable是False)的字符串(类型是字符串)。
注:描述实体属性构架的属性(Properties),例如Fixed Length,也被称为attributes。因为它在讨论"属性的属性"带来的困扰,我将把它作为attributes来指定。
Unicode, Max Length和Fixed Length属性在EF运行时都会被忽略。不要期望EF会基于这些属性自动执行验证。这些属性会被EDM的其它用它使用到,例如ASP.NET MVC 2.0和ASP.NET 动态数据控件,还有你将会有第25章学习到的,用于生成数据库脚本的的StoreGeneratedPattern属性。你可以在你基于一个低层次使用EF时使用它们;例如,同MetadataWorkspce,这个将在21章讲到。
虽然你可以使用设计器做更多的事,是时候打开它原生格式的模型了。你将在附录C中找到关于原生XML额外的讨论。在进入到下一步之前记得保存你当前所有的工作。
注:在第25章中,当在设计器中从草稿创建模型时,你将学到实体的一系列特性,它们的属性,关联和更多。
本博客已不再更新,欢迎访问新地址