9.3.9 数据访问
上一节,使用了模拟的数据从控制器发送到视图模板。现在,开始使用真正的数据库,学习如何使用SQL Server Compact版的数据库,它经常被称为SQL CE,来作为数据库引擎,SQL CE是一个免费的、嵌入式的、基于文件的数据库系统,不需要任何的安装配置,很适合本地的开发使用。
注意:可能需要单独安装SQL Server Compact 4.0数据库以及Entity Framework。在计算机上,这两个软件都是需要单独安装的。
1.修改模型类,增加艺术家类,修改album唱片类、修改genre专辑类
代码如下:
2.增加App_Data文件夹
在项目中增加App_Data文件夹用来保存数据库文件,App_Data是一个特殊的文件夹,已经被网站对其中数据的访问进行了安全限制。在解决方案资源管理器中,右击项目,选择“添加”→“添加ASP.NET文件夹”→“App_Data”,如图9-37所示。
图9-37 添加App_Data文件夹
3.在Web.config中创建数据库连接串
在网站的配置文件中增加一些行,以便Entity Framework知道如何连接到数据库,双击打开Web.config文件。在文件的最后,然后增加一个<connectionStrings>的配置节,代码如下:
注意:这里数据库连接串的名称很重要,以后使用EF Code-First的时候,通过它来找到数据库,这里的链接串种使用了Data Source=|DataDirectory|MvcMusicStore.sdf,这里的DataDirectory指的就是项目中的App_Data文件夹。如果使用SQL Server,可以使用如下的链接串。
注意providerName也要替换成SQLServer使用的提供器。
4.增加上下文类
在模型文件夹上右击,然后,增加一个新的名为MusicStoreEntities.cs的文件。需要注意的是,这个类的名称必须与数据库连接串的名称一致。这个类将反映Entity Framework数据库的上下文,用来处理创建、读取、更新和删除的操作,代码如下:
5.增加原始数据
在MvcMusicStore-Asset.zip文件中,已经包含了用来简单地创建数据的文件。在Code文件夹的子文件夹Models中找到SampleData.cs文件,将它加入到Models文件夹中。
然后,双击项目根目录中的Global.asax文件,在Application_Start方法中,使用SetIni- tializer设定初始化数据来源。代码如下:
6.修改StoreController控制器
打开StoreController.cs文件,定义一个MusicStoreEneities类的对象实例,把它命名为storeDB。代码如下:
更新一下StoreController的Index方法来获取全部的分类数据。原来使用硬编码的数据,现在,可以使用Entity Framework的Generes集合来取代它。代码如下:
对于视图模板不需要任何修改。
运行程序,访问/Store地址的时候,现在可以看到数据库中分类的列表,如图9-38所示。
图9-38 唱片流派浏览视图
当在首页通过/Store/Browse?genre=[some-genre]链接访问Browse这个方法时,需要通过流派的名称来获取相应的专辑,对于音乐店来说,每个流派的名称是唯一的,所以,可以通过LINQ中的Single扩展方法来获取查询结果中的唯一的流派对象。
Single方法使用一个Lambda表达式作为参数,表示希望获取匹配指定值的单个流派对象,在上面的例子中,将会获得名为Disco的流派对象。
在获得流派对象的同时,还可以获取流派相关的对象,例如属于这个流派的专辑集合,可以提前获取相关的专辑信息,这就需要修改一下上面的查询,包含专辑信息。通过In- clude方法可以指定希望获取的相关信息,这种方式非常有效,这样,就可以在一次数据访问中,既可以获取流派对象,也可以同时获取相关的专辑对象。
更新browse方法代码如下:
然后,可以更新一下Store的Browse视图来显示相应的专辑,打开视图模板,增加一个列表。代码如下:
运行程序,浏览/Store/Browse?genre=Jazz,现在就可以看到保存在数据库中的的专辑数据了,如图9-39所示。
图9-39 显示流派中的专辑
同样,还可以修改一下Details,通过传递的参数来获取专辑对象。修改后的方法代码如下:
运行程序,访问/Store/Details/1,可以看到如图9-40所示的内容。
图9-40 查看具体专辑信息
更新Browse视图,提供链接到明细页面的超级链接,这里,使用ActionLink方法,修改后的代码如下:
再次浏览Browse的时候,每个专辑应该已经成为了一个链接,如图9-41所示。
图9-41 browse视图