版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ASP.NETMVC程序开发第三章数据模型第三章数据模型ASP.NETMVC程序开发第
2页3.1数据模型概述3.2创建数据模型3.3ASP.NETMVC项目数据模型的选择与使用3.4库模式数据模型小结3.1数据模型概述ASP.NETMVC程序开发第
3页在ASP.NETMVC中,数据模型(Model)负责所有的与数据有关的操作,不论是控制器(Controller)还是视图(View),都会在运行时调用数据模型,或是使用数据模型里定义的一些数据操作方法,不如数据的增删改查。数据模型部分的代码,一般只能与数据和业务逻辑有关,不负责处理所有与数据无关的操作或是控制试图的显示,而是应该只专注于如何有效地提供数据访问机制、业务逻辑和数据格式验证等。由于数据模型的独立性非常高,所以在开发大型ASP.NETMVC网站时,可以将数据模型部分独立成一个项目,以便数据模型部分代码的测试与共享。3.1数据模型概述ASP.NETMVC程序开发第
4页数据模型部分的代码,一般只能与数据和业务逻辑有关,不负责处理所有与数据无关的操作或是控制试图的显示,而是应该只专注于如何有效地提供数据访问机制、业务逻辑和数据格式验证等。由于数据模型的独立性非常高,所以在开发大型ASP.NETMVC网站时,可以将数据模型部分独立成一个项目,以便数据模型部分代码的测试与共享。3.2创建数据模型ASP.NETMVC程序开发第
5页在使用VisualStudio开发ASP.NETMVC项目时,可以好好利用开发工具带来的便利。目前在ASP.NETMVC项目中最常见的数据模型是基于LINQtoSQL的数据模型和基于EntityFramework的数据模型,VisualStudio可以完美的支持这两种数据模型的创建。3.2.1基于LINQtoSQL的数据模型ASP.NETMVC程序开发第
6页
LINQtoSQL是微软开发的一门非常容易上手的关系数据库映射(ORM,Object-RelationalMapping)技术,在任何基于.NET平台的项目中都可以使用LINQtoSQL来定义数据模型。接下来将简单说明一下如何在VisualStudio2010中利用LINQtoSQL设计工具创建数据模型。3.2.1基于LINQtoSQL的数据模型ASP.NETMVC程序开发第
7页首先,创建一个ASP.NETMVC项目,并且建立好数据库,这里将按照第二章表2-2和表2-3建立数据库。然后可以按照如下步骤建立基于LINQtoSQL的数据模型。1、在“解决方案资源管理器”窗口中选择“Models”目录并单击鼠标右键,在弹出的快捷菜单中选择“添加”下面的“新建项”选项。3.2.1基于LINQtoSQL的数据模型ASP.NETMVC程序开发第
8页
2、在“添加新项”窗口的“已安装的模板”列表中选择“数据”类别,然后在项目模板列表中选择“LINQtoSQL类”并保留默认名称。最后点击“确定”按钮。3.2.1基于LINQtoSQL的数据模型ASP.NETMVC程序开发第
9页
3、在如图所示界面“服务器资源管理器”窗口中新建数据连接,并将接到目标数据库。3.2.1基于LINQtoSQL的数据模型ASP.NETMVC程序开发第
10页
4、在“服务器资源管理器”窗口中打开数据库,并将项目所需的全部数据表拖放到后缀名为“DBML”的设计试图中。3.2.1基于LINQtoSQL的数据模型ASP.NETMVC程序开发第
11页
5、VisualStudio2010会根据数据库自动创建对应的实体对象。至此,基于LINQtoSQL数据模型已经创建完成。在创建完成后自动生成的类文件中,包含了许多由VisualStudio2010自动生成的类,这些类就是与数据库表格对应的类。创建好基于LINQtoSQL数据模型后就可以在项目中通过LINQ语法快速访问数据库了。3.2.2基于EntityFramework的数据模型ASP.NETMVC程序开发第
12页
EntityFramework框架是微软公司在LINQtoSQL之后推出的另一个对象/关系映射(ORM)框架产品,该框架使得开发人员可以像使用普通对象一样来操作关系数据,而不用写很多数据库访问代码。使用EntityFramework框架创建数据模型可以降低数据模型部分所需的代码量并减少维护工作量。基于EntityFramework的数据模型有以下特点:3.2.2基于EntityFramework的数据模型ASP.NETMVC程序开发第
13页支持多种数据库(包括微软的SQL,Oracle,和DB2);包含多种数据库映射引擎,这些引擎可以绝大部分常用的数据库,并很好的支持存储过程;可以使用VisualStudio提供的集成工具创建实体数据模型,也可以根据现有数据库自动生成实体数据模型,还可以从模型生成数据库,并能手动编辑创建好的实体数据模型;3.2.2基于EntityFramework的数据模型ASP.NETMVC程序开发第
14页提供了CodeFirst功能,可以用来通过程序代码创建实体数据模型,使用CodeFirst也可以将现有实体数据模型映射到一个已有的数据库,或者从实体数据模型生成数据库;可以方便的集成到各种类型的.NET项目中,包括ASP.NET、ASP.NETMVC、WPF、WCF和WCF数据服务。3.2.2基于EntityFramework的数据模型ASP.NETMVC程序开发第
15页EntityFramework框架在底层是通过调用ADO.NET来实现数据库操作的,所以使用EntityFramework框架与直接使用ADO.NET访问数据库并不冲突。。3.2.2基于EntityFramework的数据模型ASP.NETMVC程序开发第
16页使用基于EntityFramework的数据模型有如下好处:EntityFramework框架提供了核心的数据访问功能,因此开发人员可以专注于应用逻辑,提高开发效率;3.2.2基于EntityFramework的数据模型ASP.NETMVC程序开发第
17页开发人员可以面向数据模型对象编程,包括类型继承和创建复杂类型等,在最新版的EntityFramework框架中还支持POCO(PlainOldCLRObjects,实这种对象就像文本文件一样,是一种最简单、最原始、不带任何格式的对象)数据对象;通过支持独立于物理/存储模型的概念模型,通过EntityFramework框架的使用可以让应用程序不再依赖与特定数据引擎或者存储模式;3.2.2基于EntityFramework的数据模型ASP.NETMVC程序开发第
18页使用EntityFramework框架,可以在不改变应用程序代码的情况下改变数据模型和数据库间的映射;基于EntityFramework框架的数据模型也支持LINQ语法进行数据操作。3.2.3自定义数据模型ASP.NETMVC程序开发第
19页既然LINQtoSQL和EntityFramework框架都可以自动创建数据模型,那自定义创建数据模型还有什么必要呢?主要原因就是在VisualStudio中自动创建的基于LINQtoSQL或EntityFramework的数据模型并不一定完全符合数据显示或输入输出的要求,这时就需要通过创建自定义数据模型来辅助项目开发。3.2.3自定义数据模型ASP.NETMVC程序开发第
20页虽然在ASP.NETMVC的开发模式中数据模型并不负责数据的显示工作,但有哪些数据需要被显示在视图中却是由数据模型确定的。在视图中需要确定的是数据的显示方式,如HTML或Flash等,而数据模型则是确定有哪些数据需要显示。3.2.3自定义数据模型ASP.NETMVC程序开发第
21页举例来说,在第二章的例子中,如果存储订单的数据表中有一个“订单状态”字段,该字段中的内容是在线书店对订单进行处理时保存的状态标识,而这个内容是不希望被用户看到的。在这种情况下,就可以通过创建自定义数据模型的方式来限制输出的字段中一定不会包含“订单状态”字段的数据。3.2.3自定义数据模型ASP.NETMVC程序开发第
22页以Order实体模型为例,该数据模型是基于EntityFramework并由VisualStudio根据数据库表自动创建的,如图3-7所示,只要将此数据模型直接引用到视图中,就可以吧每个属性的数据通过视图在页面上输出。如果希望“Status”这个表示订单状态的属性不要在视图中出现,就必须通过自定义数据模型的方式来限制那些字段可以被显示而那些不能。如上所述,这类专门给视图使用的自定义数据模型称为视图数据模型(ViewModel)。视图数据模型还常常被用在绑定用户输入的表单数据上。3.3ASP.NETMVC项目数据模型的选择与使用ASP.NETMVC程序开发第
23页在ASP.NETMVC项目中,数据模型基本上都是以ORM(:(Object-RelationMapping)的方式建立的,ORM即对象-关系映射,是将关系数据库中的业务数据用对象的形式表现出来,并通过面向对象的方式将这些对象组织起来,实现系统业务逻辑的过程。3.3ASP.NETMVC项目数据模型的选择与使用ASP.NETMVC程序开发第
24页在使用ORM之前,我们编写的程序和数据库之间的耦合很紧密,如果操作的是SQLServer数据库,就需要引入对应的类库(SqlConnection),对应不同的数据库需要完全不同的数据访问层的代码。引入ORM后ORM在项目中的作用如图所示:3.3ASP.NETMVC项目数据模型的选择与使用ASP.NETMVC程序开发第
25页目前在.NET平台下常见的ORM框架有NHibernate、iBatis.NET、LinqtoSQL和EntityFramework。其中EntityFramework是微软最新推出的ORM框架,也是目前.NET平台下的主流ORM框架,本节后面将重点介绍基于EntityFramework的数据模型的创建与使用。3.3.1创建基于EntityFramework的数据模型ASP.NETMVC程序开发第
26页在VisualStudio2010中创建基于EntityFramework的数据模型非常方便。首先,创建一个ASP.NETMVC项目,并且建立好数据库,这里同样按照第二章表2-2和表2-3建立数据库。然后可以按照如下步骤建立基于EntityFramework的数据模型。1、在“解决方案资源管理器”窗口中选择“Models”目录并单击鼠标右键,在弹出的快捷菜单中选择“添加”下面的“新建项”选项,如图所示。3.3.1创建基于EntityFramework的数据模型ASP.NETMVC程序开发第
27页
2、在“添加新项”窗口的“已安装的模板”列表中选择“数据”类别,然后在项目模板列表中选择“ADO.NET实体数据模型”并保留默认名称,如图所示,最后点击“确定”按钮。3.3.1创建基于EntityFramework的数据模型ASP.NETMVC程序开发第
28页3、在“实体数据模型向导”窗口中选择“从数据库产生”选项并单击“下一步”,如图所示。3.3.1创建基于EntityFramework的数据模型ASP.NETMVC程序开发第
29页
4、如图所示,新建一个指向目标数据库的链接,在最下方的文本框中输入要保存在Web.config文件中的EntityFramework连接字符串的名称并点击“下一步”。3.3.1创建基于EntityFramework的数据模型ASP.NETMVC程序开发第
30页5、如图3-14所示,设置数据库中要包含哪些数据表、视图或存储过程,以及是否要将其加入EntityFramework实体数据模型中,最后点击“完成”。
3.3.1创建基于EntityFramework的数据模型ASP.NETMVC程序开发第
31页完成上述操作后,VisualStudio2010就会自动创建好EntityFramework基础数据模型,这个数据模型可以被应用到整个项目中,如图所示。3.3.2基于EntityFramework数据模型的数据查询ASP.NETMVC程序开发第
32页
EntityFramework数据模型的查询通常可以使用LINQ语法实现,LINQ语法(即LINQtoEntities)使开发人员能够通过使用LINQ表达式和LINQ标准查询运算符,直接从开发环境中针对实体框架对象上下文创建灵活的强类型查询。具体查询步骤如下:首先,在使用EntityFramework数据模型前,一定要创建EntityFramework数据模型上下文对象的实例,如果是按照默认步骤创建EntityFramework数据模型的话,其上下文对象的名称会以Entities结尾,创建其实例的具体代码如下:3.3.2基于EntityFramework数据模型的数据查询ASP.NETMVC程序开发第
33页usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){//实例化查询上下文
using(BookStoreEntitiesdb=newBookStoreEntities()){//此处放置查询代码
}}}}3.3.2基于EntityFramework数据模型的数据查询ASP.NETMVC程序开发第
34页1、投影查询,比如查询全部的书籍,代码如下://基于表达式的查询varBooks=frombindb.Booksselectb;//输出查询结果数量Console.WriteLine(Books.Count());投影查询除了可以用上述基于表达式的方式实现之外,还可以用一种更简洁的函数式方式实现,代码如下://基于表达式的查询varBooks=db.Books;//输出查询结果数量Console.WriteLine(Books.Count());从上述代码不难看出,LINQ语法可以让我们在.NET项目中使用一种类似于SQL的语法实现数据查询。3.3.2基于EntityFramework数据模型的数据查询ASP.NETMVC程序开发第
35页2、条件查询,比如查询书名为“ASP.NETMVC程序开发”的书籍的编号,具体代码如下://基于表达式的查询varBooks1=frombindb.Bookswhereb.Title=="ASP.NETMVC程序开发"selectb;//输出查询结果的编号foreach(varbookinBooks1)Console.WriteLine(book.BookId);//同样的查询用函数式方式实现varBooks2=db.Books.Where(b=>b.Title=="ASP.NETMVC程序开发");//输出查询结果的编号foreach(varbookinBooks2)Console.WriteLine(book.BookId);在上述查询中,在函数式方式实现的代码中用到了Lambda表达式描述查询条件。3.3.2基于EntityFramework数据模型的数据查询ASP.NETMVC程序开发第
36页3、排序和分页查询,比如查询全部订单,并按数量排序并分页。//按数量排序并分页输出订单编号varOrder1=(fromoindb.Ordersorderbyo.Numselecto).Skip(0).Take(10);//输出查询结果的编号foreach(varorderinOrder1)Console.WriteLine(order.OrderId);//以函数式方式实现查询varOrder2=db.Orders.OrderBy(o=>o.Num).Skip(0).Take(10);//输出查询结果的编号foreach(varorderinOrder2)Console.WriteLine(order.OrderId);在上述代码中分页主要依靠Skip()和Take()两个方法来实现,Skip()方法设置忽略查询结构前多少项,Take()方法设置获取多少个连续的查询结果。值得注意的是,只有对查询结果进行排序了之后才能分页。3.3.2基于EntityFramework数据模型的数据查询ASP.NETMVC程序开发第
37页4、聚合查询,比如查询书籍总数和最高书籍价格等,具体代码如下://书籍总数varnum=db.Books.Count();Console.WriteLine(num);//最大书籍价格varprice=db.Books.Min(b=>b.Price);Console.WriteLine(price);聚合查询只能通过函数式代码实现。3.3.2基于EntityFramework数据模型的数据查询ASP.NETMVC程序开发第
38页5、连接查询,比如查询所有定购了“ASP.NETMVC程序开发”这本书的订单编号,具体代码如下://所有定购了“ASP.NETMVC程序开发”这本书的订单编号varOrder3=fromoindb.Ordersjoinbindb.Booksono.BookIdequalsb.BookIdselecto;foreach(varorderinOrder3)Console.WriteLine(order.OrderId);在上述代码中,join关键字用于连接两个数据表,on和equals关键字用于指定两个表是通过哪个字段连接在一起的。3.3.3基于EntityFramework数据模型的数据更新ASP.NETMVC程序开发第
39页在EntityFramework中数据的更新是通过调用实体对象的SaveChanges()方法来实现的。调用SaveChanges()方法后,EntityFramework框架会检查被上下文环境管理的实体对象的属性是否被修改过,然后,自动创建对应的SQL命令发给数据库执行。也就是说在EntityFramework数据模型中,数据更新需要通过找到被更新对象、更新对象数据和保存更改这三步来完成。3.3.3基于EntityFramework数据模型的数据更新ASP.NETMVC程序开发第
40页1、在使用EntityFramework数据模型做任何操作之前,首先都要确保正确的创建了EntityFramework数据模型上下文对象的实例,代码如下://实例化查询上下文using(BookStoreEntitiesdb=newBookStoreEntities()){//此处放置数据更新部分代码}3.3.3基于EntityFramework数据模型的数据更新ASP.NETMVC程序开发第
41页2、找到需要修改价格和名称的数据实体对象,代码如下:varbook=db.Books.FirstOrDefault(b=>b.Title=="JavaScript语言与Ajax应用");上述代码使用了FirstOrDefault()方法,该方法在没有查到符合条件的结果时返回空值,在查到符合条件的结果时返回第一条结果对应的实体对象。3.3.3基于EntityFramework数据模型的数据更新ASP.NETMVC程序开发第
42页3、更新实体对象并将修改保存到数据库,代码如下://如果查询到了实体对象if(book!=null){//更新属性值book.Title="ASP.NETMVC程序开发";book.Price=30;//保存更改db.SaveChanges();}只有在调用SvaeChanges()方法后,更新后的数据才能被写入数据库。3.3.4基于EntityFramework数据模型的数据添加与删除ASP.NETMVC程序开发第
43页利用EntityFramework数据模型实现数据的添加和删除非常方便。数据添加通过两个步骤完成,首先创建新的数据实体(一个数据实体即表示数据库表中的一行),然后调用AddToXXX这一类方法将数据实体添加到具体的数据库表对象并调用SaveChanges()方法保存到数据库即可。数据删除也是通过两个步骤完成,首先找到需要删除的数据实体,然后调用DeleteObject()方法删除数据实体并调用SaveChanges()方法保存到数据库即可。3.3.4基于EntityFramework数据模型的数据添加与删除ASP.NETMVC程序开发第
44页一般情况下,任何类型的项目只要涉及数据库的更新、添加和修改操作,肯定会碰到完整性问题。比如在上述例子中,当用户完成订购书籍行为时会涉及到多次不同的数据库操作,如何保证这些操作要么全部成功完成,要么不对数据库产生任何影响呢?在这种情况下就要用到事务,在EntityFramework数据模型中使用事务和在ADO.NET中使用事务非常类似。3.4库模式数据模型ASP.NETMVC程序开发第
45页库模式(RepositoryPattern)是专门用于数据访问的一种代码设计模式(Pattern),其设计思路是:首先定义接口(Interface),通过定义接口确定数据访问类的功能需求,接着实现该接口。在库模式下接口与类的分离有助于项目的单元测试和测试驱动开发(TDD,TestDrivenDevelopment)。
3.4库模式数据模型ASP.NETMVC程序开发第
46页让我们试着在上一节创建好的基于EntityFramework的数据模型的基础上,用库模式实现数据库访问。首先确定数据库访问的功能需求,假设上述项目在数据访问上有如下几条需求:浏览全部书籍;通过编号获取书籍;添加新书籍;通过作者查询书籍;删除书籍。然后根据需求编写数据访问接口,这里的数据访问只涉及到Books数据表,所以我们可以将接口命名为IBooksRepository,具体接口定义代码如下:3.4库模式数据模型ASP.NETMVC程序开发第
47页
publicinterfaceIBooksRepository{//浏览全部书籍
IQueryable<Books>FindAllBooks();//通过编号获取书籍
BooksGetBookById(intid);//添加新书籍
voidAdd(Booksbook);//通过作者查询书籍
IQueryable<Books>FindBooksByAuthor(stringname);//删除书籍
boolDelete(intid);}3.4库模式数据模型ASP.NETMVC程序开发第
48页创建完接口后,可以利用VisualStudio开发环境快速创建该接口的实现类,可以把这个类命名为BooksRepository,完整代码如下:publicclassBooksRepository:IBooksRepository{protectedBookStoreEntitiesdb=newBookStoreEntities();//浏览全部书籍
IQueryable<Books>IBooksRepository.FindAllBooks(){returndb.Books;}//通过编号获取书籍
BooksIBooksRepository.GetBookById(intid){returndb.Books.Where(b=>b.BookId==id).FirstOrDefault();}//添加新书籍
voidIBooksRepository.Add(Booksbook){db.AddToBooks(book);db.SaveChanges();}//通过作者查询书籍
IQueryable<Books>IBooksRepository.FindBooksByAuthor(stringname){returndb.Books.Where(b=>b.AuthorName==name);}//删除书籍
boolIBooksRepository.Delete(intid){Booksbook=db.Books.Where(b=>b.BookId==id).FirstOrDefault();if(book!=null){db.Books.DeleteObject(book);db.SaveChanges();returntrue;}elsereturnfalse;}}3.4库模式数据模型ASP.NETMVC程序开发第
49页创建完接口后,可以利用VisualStudio开发环境快速创建该接口的实现类,可以把这个类命名为BooksRepository,完整代码如下:publicclassBooksRepository:IBooksRepository{protectedBookStoreEntitiesdb=newBookStoreEntities();
3.4库模式数据模型ASP.NETMVC程序开发第
50页//浏览全部书籍
IQueryable<Books>IBooksRepository.FindAllBooks(){returndb.Books;}//通过编号获取
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年广东省深圳市宝安区中考英语二模试卷
- 人教A版(2019)高中数学必修二第二讲-空间中点线面位置关系专题 讲义
- 2025年通信工程师(中级)职业水平考试真题解析及答案
- 2025年度四川省公安厅公开遴选公务员(164人)备考考试试题及答案
- 2025年通信专业技术人员职业水平考试《综合能力》中级试题与答案
- 2025年全国广播电视播音员主持人资格考试(广播电视基础知识)自测试题及答案
- 防静电设施检测报告
- 2026年宁夏政府采购代理机构从业人员考试仿真试题及答案
- 通化市广播电视编辑记者资格考试(广播电视业务)能力提高训练试题库 (2025年)
- 2026年小学“牢记党的教导 争做强国少年”六一国际儿童节庆祝活动方案二
- 2026年广西真龙彩印包装有限公司笔试题及答案
- (2026年)低钾血症诊治与管理专家共识解读
- 法律实务2026年常见合同案例解析
- 20S515 钢筋混凝土及砖砌排水检查井
- 带状疱疹疫苗科普
- 走进人工智能-AI发展史及人工智能的应用
- 22019+02306+05404+统计学原理或者叫统计与数据分析基础-国家开发大学期末考试题复习
- 2025年陕西供销集团有限公司社会招聘(8人)笔试参考题库附带答案详解(3卷合一版)
- 优生优育学课件
- 室温下湿气快速固化聚硅氮烷的制备及其涂层性能研究
- 2025年蚌埠辅警招聘考试真题及一套完整答案详解
评论
0/150
提交评论