MVC 音乐商店 第 四 部分: 模型和数据访问
MVC 音乐商店是介绍,并分步说明了如何使用 ASP.NET MVC 和 Visual Studio 为 web 开发教程应用程序。
MVC 音乐商店是一个轻量级的示例存储实现它卖音乐专辑在线,并实现基本的网站管理、 用户登录,和购物车功能。
这个系列教程详细说明所有为构建 ASP.NET MVC 音乐商店示例应用程序采取的步骤。第 4 部分涵盖模型和数据访问。
到目前为止,我们已经只被"虚拟数据"从我们的控制器向传递我们的视图模板。现在,我们已准备好要挂接实际数据库的功能。在本教程中我们将讨论如何使用 SQL Server 紧凑版 (通常称为 SQL CE) 作为我们的数据库引擎。SQL CE 是一个免费的基于文件的嵌入式数据库,不需要任何安装或配置操作,这使它为本地开发提供了真正的便利。
数据库访问框架的代码第一次实体与
我们会使用 ASP.NET MVC 3 项目来查询和更新数据库中包含的实体框架 (EF) 支持。EF 是一个灵活的对象关系映射 (ORM) 数据的 API,使开发人员能够存储在一个数据库中的面向对象的方式的查询和更新数据。
实体框架版本 4 支持一个称为 Code First 的开发模式。代码首先使您可以通过编写简单的类 (也称为"纯老"CLR 对象从 POCO),创建模型的对象,甚至可以在从您的类飞上创建数据库。
对我们的模型类的更改
在本教程中,我们将利用在实体框架中的数据库创建功能。我们这样做之前,虽然,向我们示范类可以添加在我们稍后将使用有些事情让一些小的更改。
添加艺术家模型类
我们的唱片将与艺术家,相关联,所以我们会添加一个简单的模型类来描述一个艺术家。将一个新类添加到名为 Artist.cs 使用的代码如下所示的模型文件夹。
namespace MvcMusicStore.Models { public class Artist { public int ArtistId { get; set; } public string Name { get; set; } } }
更新我们的模型类
更新 Album 类,如下所示。
namespace MvcMusicStore.Models { public class Album { public int AlbumId { get; set; } public int GenreId { get; set; } public int ArtistId { get; set; } public string Title { get; set; } public decimal Price { get; set; } public string AlbumArtUrl { get; set; } public Genre Genre { get; set; } public Artist Artist { get; set; } } }
下一步,对 Genre 类进行了以下更新。
using System.Collections.Generic; namespace MvcMusicStore.Models { public partial class Genre { public int GenreId { get; set; } public string Name { get; set; } public string Description { get; set; } public List<Album> Albums { get; set; } } }
添加 App_Data 文件夹
我们会将 App_Data 目录添加到我们的计划,容纳我们 SQL Server Express 数据库文件。App_Data 是一个专门的目录,在 ASP.NET 中已经有了正确的安全访问权限的数据库访问。从项目菜单中,选择添加 ASP.NET 文件夹,然后 App_Data。
在 web.config 文件中创建的连接字符串
因此,实体框架知道如何连接到我们的数据库,我们将向该网站的配置文件中添加几行。双击位于在项目的根目录中的 Web.config 文件。
滚动到底部的此文件和添加 < connectionStrings > 节直接上面的最后一行,如下所示。
<connectionStrings> <add name="MusicStoreEntities" connectionString="Data Source=|DataDirectory|MvcMusicStore.sdf" providerName="System.Data.SqlServerCe.4.0"/> </connectionStrings> </configuration>
添加上下文类
用鼠标右键单击模型文件夹并添加一个名为 MusicStoreEntities.cs 的新类。
此类将代表的实体框架数据库上下文和将处理我们创建、 读取、 更新和删除操作,我们。此类的代码如下所示。
using System.Data.Entity; namespace MvcMusicStore.Models { public class MusicStoreEntities : DbContext { public DbSet<Album> Albums { get; set; } public DbSet<Genre> Genres { get; set; } } }
就这么简单 - 没有其他配置、特殊接口等。通过扩展 DbContext 基类,我们 MusicStoreEntities 类是能够处理我们为我们的数据库操作。现在,我们有,挂接,让我们将更多的属性添加到我们的模型课要充分利用我们的数据库中的一些额外信息。
添加我们存储目录数据
我们将利用一项功能的实体框架,将"种子"的数据添加到新创建的数据库中。这将预填充我们与流派、 艺术家和专辑的列表的存储目录。MvcMusicStore Assets.zip 下载-其中包括较早前在本教程中使用我们的网站设计文件-有与此种子数据,位于文件夹名为代码中的类文件。
在代码内 / 模型文件夹中,找到 SampleData.cs 文件并将其放入我们的项目,在模型文件夹,如下所示。
现在我们需要添加一行代码来告诉那个 SampleData 类实体框架。双击要打开它,并将以下行添加到顶部的 Application_Start 方法的项目的根目录中的 Global.asax 文件。
protected void Application_Start() { System.Data.Entity.Database.SetInitializer( new MvcMusicStore.Models.SampleData()); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); }
此时,我们已经完成必要要为我们的项目配置实体框架的工作。
查询数据库
现在让我们更新我们的 StoreController,这样,而不是使用"虚拟数据"它相反调用到我们的数据库来查询其所有的信息。我们首先要在StoreController举行的名为 storeDB 的 MusicStoreEntities 类的实例上声明的字段:
public class StoreController : Controller { MusicStoreEntities storeDB = new MusicStoreEntities();
更新存储索引来查询数据库
MusicStoreEntities 类由实体框架,并公开在我们的数据库中的每个表的集合属性。让我们更新我们 StoreController Index 操作来检索所有流派在我们的数据库中。以前我们做这通过硬编码的字符串数据。现在我们可以只使用实体框架上下文 Generes 集合:
public ActionResult Index() { var genres = storeDB.Genres.ToList(); return View(genres); }
不需要更改发生在我们的视图模板因为我们仍然把送回之前-我们都只返回实时数据从我们的数据库现在我们返回相同的 StoreIndexViewModel。
当我们再次运行该项目,并访问“/Store”的 URL 时,我们现在会在我们的数据库中看到所有流派的列表:
更新存储浏览和详细资料来使用实时数据
通过 /Store/Browse?genre=[some-genre] 操作方法,我们要按名称搜索流派。我们只期待一个结果,因为我们永远不应该有相同的类型排列的主题名称,两个条目,这样我们就可以使用。Single() 扩展在 LINQ 查询为适当的类型排列对象像这样 (不键入这尚未):
var example = storeDB.Genres.Single(g => g.Name == “Disco”);
该单个方法采用 Lambda 表达式作为参数,指定我们希望体裁的单个对象,这样它的名称相匹配,我们已定义的值。在上述案例中,我们正与名称值匹配的迪斯科装载体裁的单个对象。
我们会利用一个允许我们以指示体裁对象进行检索时,我们想要加载以及其他相关的实体的实体框架功能。此功能称为查询结果形成,并使我们能够减少我们需要访问数据库以检索所有我们需要的信息的次数。我们想要预取的体裁我们检索相册所以我们会更新我们的查询,包括从 Genres.Include("Albums") 来表示我们想要相关的专辑以及。这是效率更高,因为它将我们的体裁和专辑在检索数据单个数据库的请求。
碍事的解释,这是我们最新的浏览控制器操作的看起来:
public ActionResult Browse(string genre) { // Retrieve Genre and its Associated Albums from database var genreModel = storeDB.Genres.Include("Albums") .Single(g => g.Name == genre); return View(genreModel); }
现在,我们可以更新存储浏览要显示的视图,可在每一种风格的专辑。打开视图模板 (中都可以找到 /Views/Store/Browse.cshtml),如下所示添加项目符号列表的专辑。
@model MvcMusicStore.Models.Genre @{ ViewBag.Title = "Browse"; } <h2>Browsing Genre: @Model.Name</h2> <ul> @foreach (var album in Model.Albums) { <li> @album.Title </li> } </ul>
运行我们的应用程序并浏览到存储/浏览? 流派 = 爵士乐表明,从数据库中,在我们所选的体裁中显示所有相册现在拉扯了我们的结果。
我们将在我们的 /Store/Details/[id] URL 上做出相同的更改,然后将我们的哑元数据替换成一个数据库查询,用于加载 ID 与参数值匹配的专辑。
public ActionResult Details(int id) { var album = storeDB.Albums.Find(id); return View(album); }
运行我们的应用程序并浏览到 /Store/Details/1 显示我们的结果现在正在从数据库被拉扯。
现在,我们的存储的详细信息页面设置为通过专辑 ID 显示一张专辑,让我们更新浏览视图链接到详细信息视图。我们将使用 Html.ActionLink,和我们一样要从存储索引链接到商店浏览在前一节的末尾。完整源代码的浏览视图显示的下方。
@model MvcMusicStore.Models.Genre @{ ViewBag.Title = "Browse"; } <h2>Browsing Genre: @Model.Name</h2> <ul> @foreach (var album in Model.Albums) { <li> @Html.ActionLink(album.Title, "Details", new { id = album.AlbumId }) </li> } </ul>
我们现在能够从我们存储页面浏览至一个流派页面,其中列出了可用的专辑,并通过单击一张专辑的我们可以查看该唱片集的详细信息。