您好,欢迎访问三七文档
当前位置:首页 > 财经/贸易 > 进出口许可 > 使用Entity Framework 4进行代码优先开发
使用EntityFramework4进行代码优先开发使用EntityFramework4进行代码优先开发【原文地址】Code-FirstDevelopmentwithEntityFramework4【原文发表日期】2010/7/164:35AM.NET4随带发布了一个改进版的EntityFramework(EF)—一个位于System.Data.Entity命名空间的数据访问函数库。当EntityFramework在.NET3.5SP1里第一次发布的时候,很多程序员给我们提供了反馈,指出他们认为在第一个版本中不足的地方。SQL团队积极听取这些意见,并且在.NET4的版本里吸取了意见。EF4里一些重大改进包含有:·支持简单CLR对象(POCO):现在你不需要基类或者数据持久化属性就可以定义实体了。·支持延迟加载:现在你可以即时加载子对象,而不是预先加载它们。·支持N-层技术和自跟踪实体:用来处理在层间传输实体或者无状态Web调用的情况。·更好的SQL语句生成和存储过程的支持:EF4执行的是更快的SQL,而且还包括了对更好的存储过程集成支持。·支持自动的单复数名词转换:EF4支持对表名自动转换单复数(例如:Categories-Category)。·更佳的可测性:在EF4里,现在可以更容易地根据接口来创建模拟对象。·支持更多的LINQ操作符:EF4现在支持LINQ所有的操作符。VisualStudio2010同时也提供了更丰富的针对EF的设计器和工具。VS2010的EF设计器同时支持“数据库优先”的开发模式—即通过已有的数据库在设计界面上创建模型层。和支持“模型优先”的开发模式—即你在设计界面上先定义好模型层,然后再根据它生成数据库的结构。使用EF进行代码优先开发除了支持以设计器为基础的开发流程,EF4还支持一个以代码为中心的开发方案,我们称它为“代码优先开发”。代码优先开发开启了一个美好的开发流程。它允许你:·不需要打开设计器或者定义一个XML映射文件就可以开发程序。·只需要写一个简单的类就可以定义模型对象,而不要求有任何基类。·使用“惯例高于配置”的方式来实现数据库持久化,不需要显式配置任何东西。·也可以有选择性的复写基于惯例的持久化,并提供一个更流畅的API来完全定制持久化映射。要使用EF的“代码优先开发”概念,当前你需要额外下载一个运行在.NET4内置EF之上的工具。“代码优先”函数库的CTP4版本已于本周发布,你可以从这里下载。你可以在VS2010的任一个.NET4项目中使用它(包括ASP.NETWeb窗体项目和ASP.NETMVC)。手把手教程:使用代码优先的方式创建NerdDinner去年我写了一篇ASP.NETMVC1.0的教程,发表在博客和一本书里。这篇教程捋了一遍创建一个叫做“NerdDinner”的简单程序的过程,这个程序方便人们在线组织、主办和参加餐会。可以在这里参阅我原先的ASP.NETV1NerdDinner教程。新书ASP.NETMVC2高级编程也包含了更新过的教程。这篇NerdDinner教程原先使用的是“数据库优先”的方式,也就是预先定义好数据库结构,然后使用VisualStduio设计器创建LINQtoSQL或LINQtoEntities等模型对象来做映射。下面我将演示如何用EF4的“代码优先”的方式来创建NerdDinner的模型层和数据库结构,然后使用ASP.NETMVC创建一个增删改查程序。我们将一步一步地创建这个程序,本文的最后有完整示例代码的下载链接。第一步:新建一个空的ASP.NETMVC2程序我们从在VisualStudio2010新建一个ASP.NETMVC2项目开始,选择文件-新项目并使用“ASP.NETMVC2空Web应用程序”项目模板就行了。这样就会新建一个空的ASP.NETMVC2工程,里面没有什么控制器、模型和视图。下一步我们将定义NerdDinner“模型”——表示程序中数据的对象,以及包含验证机制和业务规则等的逻辑。模型是基于MVC程序的“心脏”,实际上掌控了程序的行为。我们将使用EF4新的“代码优先”方式来创建这个模型层。第二步:创建模型现在假设我们尚未创建数据库,从头开始创建NerdDinner程序。我们不需要从数据库开始当使用代码优先的开发流程时,我们不需要从先创建数据库或者定义数据库结构来开始程序开发。而可以从定义最适合我们程序的模型对象的标准.NET类开始——免除在里面混杂数据持久化逻辑的烦恼。创建模型类型NerdDinner是一个小程序,所需要的数据存储非常简单。我们希望能定义和存储代表人们可参加的事件——“Dinners(餐会)”。我们还希望能够定义和存储参加餐会的人员——“RSVP”,用来跟踪有兴趣参加特定餐会的人。让我们来创建两个类(Dinner和RSVP)来表现这个概念。在我们的ASP.NETMVC项目中添加两个类——“Dinner”和“RSVP”就可以了:上面的“Dinner”和“RSVP”模型类就是“简单CLR对象”(即POCO)。它们不需要继承什么基类或者实现什么接口,而且里面定义的属性都是标准的.NET数据类型。里面没有添加数据持久化属性和操作数据的代码。不需要在定义模型类时将他们绑定到特定的数据库、数据库API和数据库结构的功能的确很好,很强大——而且也让我们有了更弹性的数据访问方式。这样我们就能专注于程序和业务需求上,而不用过多考虑持久化的实现方式。另外,它还为我们提供了更换数据库结构或者存储实现方式的弹性空间—不需要重写模型对象或者与它们交互的代码。创建Context类来处理数据持久化我们已经定义了两个POCO模型类,现在让我们创建一个类来处理在数据库获取或保存Dinner和RSVP实例的工作。我们将这个类命名为“NerdDinners”。它继承于DbContext基类,并且定义了两个公开属性——一个用来公开Dinner对象集合,另外一个公开RSVP对象集合:上面用到的DbContext和DbSet类是EF4代码优先函数库自带的。你需要添加对System.Data.Entity.CTP程序集的引用,它位于目录\ProgramFiles\MicrosoftADO.NETEntityFrameworkFeatureCTP4\Binaries中。另外在“NerdDinners”类型定义文件中,你需要添加“usingSystem.Data.Entity”命名空间的引用。这就是所有我们需要编写的代码了上面三个类就是为我们NerdDinner程序实现一个基本的模型和数据持久层所需要的所有代码了。我们不需要配置额外的数据库结构影射信息,不需要运行任何工具,不需要编写什么XML文件,不需要用什么设计器来使用我们的类在数据库中获取、更新和存储数据。基于惯例的持久化影射不需要写什么额外代码,不需要创建什么XML文件,不需要运行什么工具来在数据库中映射我们的模型类。你可能会问,这可能吗?默认情况下,EF代码优先库支持一个“惯例高于配置”的方式,它使用常见的映射习惯,从而避免显式地做任何配置。如果你想使用自定义的数据库映射规则的话,可以复写这些惯例。但如果你使用惯例的话,你会发现你自己需要写的代码真的很少,在不需要添加额外的代码和配置的前提下,90%的常见情况都可以正常工作。在上面我们的例子当中,NerdDinnerContext类默认会将“Dinners”和“RSVPs”属性映射为数据库的“Dinners”和“RSVPs”数据表。“Dinners”表里每一行都被映射成“Dinner”类型的一个实例。当然啦,“RSVPs”表里每一行都被映射成“RSVP”类型的一个实例。“Dinner”和“RSVP”类型里的属性也就随之被映射成“Dinners”和“RSVPs”表里的列。EF支持的其它的惯例包括通过常见命名模式自动识别主键和外键(例如:根据Dinner类里的ID或者DinnerID属性推断出主键)。EF还灵巧地支持在两个模型间绑定相联关系的惯例。这里有一篇EF团队的博客讲解了所支持的默认惯例的工作方式。使用我们模型的代码示例前面我们创建的三个类包含了所有实现NerdDinner模型和数据持久化的所有代码。现在我们来看一些代码示例,看看如何使用这些类来执行常见的数据库操作:使用LINQ表达式执行查询用下面的LINQ查询表达式从数据库中获取数据。下图使用了LINQ表达式来获取所有将要举行的餐会:我们在写LINQ表达式的时候也可以利用Dinners和RSVPs存在的关系。留意下图“where”子句过滤出参加人数大于0的餐会的方式:要注意的是上面的查询的“where”子句(即只获取至少有一人参加的餐会)是在服务器端执行的——使执行查询和加载的数据量更为高效。获取一个实例我们可以使用LINQ的Single()函数,加上Lamda查询来获取Dinner的一个实例,如下面的代码所示:或者,我们也可以利用EF“代码优先”函数库提供的Find()函数,根据ID来加载一个实例:举办新餐会下面的代码演示了如何创建一个新的Dinner实例并把它添加到数据库中。所有我们需要做的工作就是“new”一个Dinner对象,设置它的属性,最后把它加到NerdDinnerContext对象的Dinners属性中。NerdDinnerContext类支持“工作单元”的模式,即你可以在Context中添加多个模型,然后调用“SaveChanges()”以事务的方式保存所有的数据库变动。更新餐会信息下面的代码演示了获取一个Dinner实例,更新其中一个属性,然后将改动保存到数据库的过程:第三步:创建使用我们的模型的ASP.NETMVC控制器现在来看看使用模型的更完整的场景,使用一个控制器类型来公布即将到来的餐会列表,并允许用户添加新的餐会:右键单击“Controllers”文件夹,然后选择“添加-控制器”菜单项,我们把新的控制器命名为“HomeController”。接着添加三个“动作函数”用来处理前面使用EF“代码优先”函数库创建的NerdDinners模型:.“Index”动作函数加载并显示即将到来的餐会列表。而“Create”动作函数允许用户发布新的餐会。第一个“Create”函数用来处理用户访问/HOME/Create页面时,处理“HTTPGET”的场景,以及发一个“NewDinner”表单让用户填写。而第二个“Create”函数用来处理跟那个表单关联起来的“HTTPPOST”场景—将新餐会信息保存到数据库中。如果有任何验证错误,它会重新显示表单并加上相应的错误消息。给我们的控制器加上视图下一步将是给项目里加两个“视图模板”——一个给“Index”,另外一个给“Create”。把鼠标放在控制器里的Index函数里,就可以在项目中为它添加一个视图了,然后单击右键在菜单中选择“添加视图”,弹出“添加视图”对话框。我们将创建一个强类型视图,然后给它传入一个包含“Dinner”模型对象的IEnumerable列表:单击“添加”后,VisualStudio会创建一个/Views/Home/Index.aspx文件。再添加以下这些代码——为餐会信息生成一个ul列表,然后显示创建餐会的链接:把光标放在控制器的Create函数来在项目中添加“Create”视图,单击右键菜单里的“添加视图”命令。在“添加视图”对话框中,我们还是指定创建一个强类型视图,然后传给它一个Dinner对象。另外还说明了我们希望使用“Create”模板搭个框架:单击“添加”后,VisualStudio会创建一个/Views/Home/Create.aspx文件,里面有一个包含了为“Dinner”对象生成的HTMLform表单的草案。我们做一点点的调整,并删掉了为DinnerID属性生成的input元素。最终的视图模板如下所示:迄今为止,我们已经写好了网站里实现列出餐会清单和创建餐会信息的控制器和视图的所有代码。第四步:数据库代码已经写好了。现在让我们来运行程序。但数据库呢?我们现在还没有数据库呢——其实
本文标题:使用Entity Framework 4进行代码优先开发
链接地址:https://www.777doc.com/doc-5503248 .html