四、数据访问到目前为止,我们仅仅实现了从控制器向视图模板传递虚假数据。接下来我们将要学习如何绑定真实的数据源。在这本教程当中,我们研究的数据库是SQLServerCompactEdition(俗称SQLCE示例数据库)。SQLCE是一个简洁的,嵌入式的,不用安装任何配置文件的数据库,这使得它便于本地开发。1、使用实体框架Code-First(代码优先模式)进行数据访问我们将使用支持ASP.NETMVC3项目查询和更改数据的实体框架(EF)。EF是一个很灵活的对象映射关系,他允许开发工程师用面向对象的方式对数据库数据进行查询和更改。实体框架4版本支持一个叫做Code-First的开发模式。Code-First允许通过写简单实体类(也被认为是旧版本的CLR实体的POCO)以及在类中创建数据源从而去创建model实体。2、更改我们的Model类我们将充分利用本教程中的创建数据库中的功能,之前我们已经做过些许的修改,在模型中添加了一些内容,在稍后我们会使用这些功能。3、添加ArtistModel类我们的相册将会与Artists,因此我们添加一个简单的model类用以描述一个Artist。添加一个新类,命名为Artist.cs,更改代码如下:publicclassAritist{publicintArtistId{get;set;}publicstringName{get;set;}}4、更新Model类(1)像如下代码一样更新AlbumModel类:namespaceMvcMusicStore.Models{publicclassAlbum{publicintAlbumId{get;set;}publicintGenreId{get;set;}publicintArtistId{get;set;}publicstringTitle{get;set;}publicdecimalPrice{get;set;}publicstringAlbumArtUrl{get;set;}publicGenreGenre{get;set;}publicArtistArtist{get;set;}}}(2)接下来紧接着更新Genre类:namespaceMvcMusicStore.Models{publicclassGenre{publicintGernreId{get;set;}publicstringName{get;set;}publicstringDescription{get;set;}publicListAlbumAlbums{get;set;}}}5、添加App_Data文件夹我们添加一个App_Data目录到我们的项目中用以控制SQLServerExpress的数据库目录。App_Data是一个对于访问数据库具有完全正确的访问权限的特殊文件夹。在项目目录中选择添加ASP.NETFolder,在选择App_Data。6、在Web.config文件中创建一个连接字符串我们要在网站配置文件中添加连接字符串,以便于EntityFramework可以清楚地明白如何链接数据库。在“解决方案资源管理器”中双击Web.config文件。在Web.config文件中再/configuration之前添加如下内容:connectionStringsaddname=MusicStoreEntitiesconnectionString=DataSource=|DataDirectory|MvcMusicStore.sdfproviderName=System.Data.SqlServerCe.4.0//connectionStrings/configuration7、添加一个Context类右键单击Models文件夹添加一个新类,命名为MusicStoreEntities.cs。这个类表示实体框架数据库上下文,并且为我们进行操作创建,读取,更新以及删除操作。代码如下:usingSystem.Data.Entity;namespaceMvcMusicStore.Models{publicclassMusicStoreEntities{publicDbSetAlbumAlbums{get;set;}publicDbSetGenreGenres{get;set;}}}这个类并没有其他的配置,特殊的接口等等。通过继承DbContext这个基类,我们的MusicStoreEntities类就可以帮助我们控制我们对数据的操作。现在我们得到这个链接,让我们为我们model类添加一些更多地属性来利用我们数据库中的附加信息。8、添加商店数据目录我们将利用实体框架,增加了“种子”的数据到一个新创建的的数据库中的这个特点。它会为我们的商店预录入一个包含类别列表,艺术家列表以及专辑列表的目录。在我们下载下来的MvcMusicStore-Assets.zip文件中,其中包括这样的一个种子数据,这个文件位于一个叫做“Code”的文件夹中。在Code/Models文件夹中,找到SampleData.cs文件并且把它拖放到我们项目中的Models文件夹下。先下图所示:现在我们需要添加一行数据用来向设计框架添加这个SampleData类。双击Global.asax文件在Application_Start方法的首行添加如下代码:protectedvoidApplication_Start(){System.Data.Entity.Database.SetInitializer(newMvcMusicStore.Models.SampleData());AreaRegistration.RegisterAllAreas();RegisterGlobalFilters(GlobalFilters.Filters);RegisterRoutes(RouteTable.Routes);}9、查询数据现在我们更新我们的StoreController,并不是使用假数据,而是从我们的数据库中查询出所有的数据。我们现在在StoreController中声明一个字段来操控MusicStoreEntities的实体类,命名为storeDB:publicclassStoreController:Controller{MusicStoreEntitiesstoreDB=newMusicStoreEntities();10、修改StoreController控制器的Index方法:publicActionResultIndex(){vargenres=storeDB.Genres.ToList();returnView(genres);}运行网页查看:11、继续修改Browse方法:publicActionResultBrowse(stringgenre){vargenreModel=storeDB.Genres.Include(Albums).Single(g=g.Name==genre);returnView(genreModel);}同时相应的修改Browse(/Views/Store/Browse.cshtml)视图@modelMvcMusicStore.Models.Genre@{ViewBag.Title=Browse;}h2BrowsingGenre:@Model.Name/h2ul@foreach(varalbuminModel.Albums){li@Html.ActionLink(album.Title,Details,new{id=album.AlbumId})/li}/ul12、修改Details方法publicActionResultDetails(intid){varalbum=storeDB.Albums.Find(id);returnView(album);}启动成功,看看效果:点击类别,显示所有属于这个类别的唱片信息,并连接到对应的唱片详细:显示唱片详细:五、使用脚手架功能创建编辑页面1、创建StoreManagerController:右键点击Controller文件夹,添加控制器,注意红圈的选项!点击添加按钮,此时VS2010为我们做了以下几件事:1.创建了一个StoreManagerController。2.在Views文件夹里添加了一个StoreManager文件夹。3.在StoreManager文件夹添加了以Album类为强类型的Create.cshtml,Delete.cshtml,Details.cshtml,Edit.cshtml,andIndex.cshtml五个视图模板。在StoreManagerController里,VS2010自动为了我们创建了CRUD方法。修改生成的视图模板:主要删除这两行thAlbumArtUrl/thtd@Html.DisplayFor(modelItem=item.AlbumArtUrl)/td其实改不改也无所谓,只是不显示这行数据罢了!运行程序,浏览/StoreManager/:点解编辑Edit,编辑唱片信息:点击BacktoList链接,再点击Detail,查看唱片明细:点击BacktoList链接,再点击Delete,,可以删除唱片信息:这个视图模板还是挺强大的,一下子就把我们需要做的代码都生成了,下面来赏识一下代码:publicActionResultCreate(){ViewBag.GenreId=newSelectList(db.Genres,GenreId,Name);ViewBag.ArtistId=newSelectList(db.Artists,ArtistId,Name);returnView();}Create的Get方法,返回的是一个空的View(),不过通过ViewBag返回了两个集合,Genres和Albums。这样,在视图模板就可以通过这句话,绑定下拉列表的数据:divclass=editor-field@Html.DropDownList(GenreId,String.Empty)@Html.ValidationMessageFor(model=model.GenreId)/divPOST方法,把用户填写的数据提交给服务器,验证数据成功后,执行5-6行代码保存数据到数据库:////POST:/StoreManager/Create[HttpPost]publicActionResultCreate(Albumalbum){if(ModelState.IsValid){db.Albums.Add(album);db.SaveChanges();returnRedirectToAction(Index);}ViewBag.GenreId=newSelectList(db.Genres,GenreId,Name,album.GenreId);ViewBag.ArtistId=newSelectList(db.Artists,ArtistId,Name,album.ArtistId);returnView(album);}其他的Edit,Delete,Details等都类似。就不一一讲解,大家可以试试。2、StoreManager的Index页的Artist和Title太长了,影响美观。Razor提供的@helper语法可以方便我们在视图中编写自己函数,下面我们利用这一特点,写一个字符串截取函数。在/Views/StoreManager/Index.cshtml,Index视图的@model{}后面添加以下代码:@helperTruncate(stringinput,intlength){if(input.Length=length){@input}else{@input.Substring(0,length)text…/text}}然后修改Artist和Title的显示模板:这几行:td@Html.D