008-添加数据访问

上一次,我们使用了模拟的数据从控制器发送到视图模板。现在,我们开始使用真正的数据库,在这个教程中,我们将指导如何使用LocalDB数据库。

当然,你还可以使用熟悉的 SQL Server 数据库。

1.技术介绍

(1)LocalDB

随着SQL Server 2012的发布,LocalDB跃入我们的视线,它可以被看做是SQL Server Express的轻量级版本。LocalDB专门为开发人员创建,它非常易于安装,几乎无需管理,兼容T-SQL语言,编程接口与SQL Server Express别无二致。有了LocalDB,开发人员就不需要在自己的笔记本上安装和维护一个庞大的SQL Server实例了。另外,LocalDB也适用于小型应用环境,开发人员可以将其用于小型生产环境或者嵌入式环境。

说了这么多,现在让我们来看看LocalDB的核心技术特性:

  • 兼容其它SQL Server版本,使用sqlservr.exe作为服务进程,使用相同的客户端访问接口(如ADO.NET、ODBC或PDO),兼容T-SQL编程语言。
  • 在同一台计算机上不必安装多个LocalDB,不同的应用程序可以并行执行多个LocalDB进程,但所有的进程都是从同一个可执行文件(sqlservr.exe)启动的。
  • LocalDB不会创建任何系统服务,LocalDB进程会根据需要自动启动、停止。应用程序只需连接“Data Source=(localdb)\v11.0”,LocalDB就会作为应用程序的子进程启动。随着连接的终止,LocalDB进程也会随之停止。
  • LocalDB支持AttachDbFileName属性,允许开发者指定数据库文件位置。例如:
Data Source = (localdb)\v11.0;
Integrated Security = true;
AttachDbFileName = C:\MyData\Database1.mdf 

ADO.NET Entity Framework 4.1

EF 4.1有哪些新玩新儿?

1. 首先当然是DbContext API,它是基于以前版本中的ObjectContext和其他一些类型抽象出的一个简单的API,针对常用开发场景和编程模式进行了优化。DbContext可以被于Database First, Model First, Code First三种开发模式。

2. Code First是基于Entity Framework的新的开发模式,原先只有Database First和Model First两种。Code First顾名思义,就是先用C#/VB.NET的类定义好你的领域模型,然后用这些类映射到现有的数据库或者产生新的数据库结构。Code First同样支持通过Data Annotations或fluent API进行定制化配置。

这里的数据访问就使用 Code First 完成,它会使你的数据访问惊人地简单。

关于ADO.NET Entity Framework 4.1,我以前翻译了一个系列,地址: http://www.cnblogs.com/haogj/archive/2011/05/06/2038965.html

ADO.NET Entity Framework 4.1 安装文件下载地址:http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=8363

使用 Entity Framework Code-First 进行数据访问

我们将使用包含在 ASP.NET MVC3 中的 Entity Framework (EF) 支持进行查询和更新数据库中的数据。EF 是一个灵活的进行数据访问的对象关系映射 API,允许开发人员使用面向对象的方式对数据库中的数据进行查询和更新。

Entity Framework 4 支持一种称为代码优先的开发模式,代码有限允许你通过编写简单的类来创建模型对象(也被称为 POCO, 简单的,老的 CLR 对象),然后通过类来创建数据。

注意,需要在你的项目中引用程序集 EntityFramework,在你安装 Entity Framework 的文件夹中可以找到这个程序集。

修改我们的模型类

我们将延后数据库的创建工作,在完成这个任务之前,我们先修改我们得模型类,增加我们需要的内容。

增加艺术家 Artist 类

我们的专辑将要关联到艺术家,所以,我们需要增加一个简单的类来描述艺术家,增加一个新的名为 Artist 的类。

namespace MvcMusicStore.Models {     public class Artist     {         public int ArtistId { get; set; }         public string Name { get; set; }     } }

更新现有的模型类

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 类

namespace MvcMusicStore.Models {     public 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 文件夹

这一步并不必要,如果使用 SQL CE4,可以用来保存数据库文件,如果使用 SQL Server 则不一定需要。

我们在项目中增加 App_Data 文件夹用来保存数据库文件,App_Data 是一个 ASP.NET 中特殊的文件夹,已经被网站对其中数据地访问进行了安全限制,从项目的菜单中,选择增加 ASP.NET 文件夹,然后,选择 App_Data.

在 Web.config 中创建数据库连接串

我们需要在网站的配置文件中增加一些行,以便 Entity Framework 知道如何连接到我们的数据库,双击 Web.config 文件。

卷到文件的最后,然后增加一个 <connectionStrings> 的配置节,如何所示:

<connectionStrings>     <add name="MusicStoreEntities"     connectionString="Data Source=|DataDirectory|MvcMusicStore.sdf"     providerName="System.Data.SqlServerCe.4.0"/>  </connectionStrings>

注意,这里数据库连接串的名称很重要,以后使用 EF Code-First 的时候,通过它来找到数据库,这里的链接串种使用了 Data Source=|DataDirectory|MvcMusicStore.sdf,这里的 DataDirectory 指的就是项目中的 App_Data 文件夹夹。

如果使用 SQL Server, 可以使用如下的链接串。注意 providerName 也要替换成 SQLServer 使用的提供器。

<!-- 数据库连接串的配置 -->   <connectionStrings>     <add name="MusicStoreEntities"         connectionString="server=.\sqlexpress;database=musicstore;integrated security=true;"         providerName="System.Data.SqlClient"/> </connectionStrings>

增加上下文类

在模型文件夹上右键点击,然后,增加一个新的名为 MusicStoreEntities.cs 的文件。 需要注意的是,这个类的名称必须与数据库连接串的名称一致。

这个类将反映 Entity Framework 数据库的上下文,用来处理创建,读取,更新和删除的操作,代码如下所示:

using System.Data.Entity;namespace MvcMusicStore.Models {     public class MusicStoreEntities:         DbContext     {         public DbSet<Album> Albums { get; set; }         public DbSet<Genre> Genres { get; set; }         public DbSet<Artist> Artists { get; set; }     } }

注意,这里使用了 System.Data.Entity 命名空间。记得要 using 一下。

不需要其他的配置,特定的接口等等,通过扩展 DbContext 基类,我们得 MusicStoreEntities 类就可以处理我们对数据库的操作了,现在,我们就开始,先为我们的类增加一些属性来从数据库获取额外的信息。

增加我们的商店分类数据

对于 Code First 来说,我们首先定义模型,然后通过模型来创建数据库,甚至也不需要写 Insert 语句,我们可以通过标准的 C# 代码来创建表中的记录。

我们先通过一些种子数据通过 Entity Framework 为新创建的数据库增加一些数据。先创建我们的商店分类,这需要通过一个 Genres 的列表完成,还有专辑。在 MvcMusicStore-Asset.zip 文件中,已经包含了用来简单地创建数据的文件,有一个保存在 Code 文件夹中的类来完成。

在 Code 中的 Models 文件夹中,找到 SampleData.cs 文件,将它加入到 Models 文件夹中,如下所示。

现在,我们需要增加一些代码来告诉 Entity Framework 关于 SampleData 类的事情。双击 Global.asax 文件,打开它,在 Application_Start 方法中,增加如下的行。

// 一般用来进行网站的初始化 protected void Application_Start() {  System.Data.Entity.Database.SetInitializer(new MvcMusicStore.Models.SampleData());    AreaRegistration.RegisterAllAreas();    RegisterGlobalFilters(GlobalFilters.Filters);     RegisterRoutes(RouteTable.Routes); }

这个方法用来初始化数据库,然后填充一些数据。

这样,我们就完成了配置 Entity Framework 的工作。

查询数据库

现在,我们更新一下我们的 StoreController 以便取代以前模拟的数据,通过调用我们的数据库来查询实际数据。我们先在 StoreController 中定义一个字段来访问我们的 MusicStoreEneities 类的对象实例,它命名为 storeDB。

using MvcMusicStore.Models;namespace MvcMusicStore.Controllers {     public class StoreController : Controller     {         MusicStoreEntities storeDB = new MusicStoreEntities();

更新 Index Action 查询数据库

MusicStoreEntities 类通过 Entity Framework 提供了数据库中数据表的集合,更新一下 StoreController 的 Index Action 方法来获取全部的分类数据。我们原来使用硬编码的数据,现在,我们可以使用 Entity Framework 的 Generes 集合来取代它了。

对于 EF 的使用,我建议你了解一下 Repository 模式。

// // GET: /Store/ public ActionResult Index() {     var genres = storeDB.Genres.ToList();    return this.View( genres ); }

对于视图模板不需要任何修改,我们仍然返回同样的 StoreIndexViewModel 。

运行程序,访问 /Store 地址的时候,我们现在可以看到数据库中分类的列表。

使用数据库中的数据更新浏览和明细页面

当在首页通过 /Store/Browse?genre=[some-genre] 链接访问 Browse 这个 Action 的时候,我们需要通过流派的名称来获取相应的专辑,对于我们的音乐店来说,每个流派的名称是唯一的,可以通过 LINQ 中的 Single 扩展方法来获取查询结果中的唯一的流派对象。

var example = storeDB.Genres.Single(g => g.Name == “Disco”);

Single 方法使用一个 Lambda 表达式作为参数,表示我们希望获取匹配指定值的单个流派对象,在上面的例子中,我们将会获得名为  Disco 的流派对象。

通过 EF ,在获得流派对象的同时,我们还可以获取流派相关的对象,例如属于这个流派的专辑集合,我们可以提前获取相关的专辑信息,这就需要我们修改一下上面的查询,包含专辑信息。通过 Include 方法可以指定我们希望获取的相关信息,这种方式非常有效,这样,我们就可以在一次数据访问中,既可以获取流派对象,也可以同时获取相关的专辑对象。

这样更新之后,我们的 Action 方法将会成为下面的样子。

// /Store/Browse?genre=DISCO public ActionResult Browse( string genre ) {     var genreModel = storeDB.Genres.Include("Albums").Single(g => g.Name == genre);    return this.View(genreModel); }

注意,在流派 Genre 的属性中有一个名为 Albums 的集合属性。

然后,我们可以更新一下 Store 的 Browse 视图来显示相应的专辑,打开视图模板,增加一个列表。

@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/Browse?genre=Jazz,现在就可以看到保存在数据库中的的专辑数据了。

同样,我们还可以修改一下 Details ,通过传递的参数来获取专辑对象。修改后的方法如下所示。

// /Store/Details/5 public ActionResult Details(int id) {     var album = storeDB.Albums.Find(id);     return View(album); }

运行程序,访问 /Store/Details/1,应该可以看到下面的内容。

我们更新一下 Browse 视图,提供链接到明细页面的超级链接,这里,我们使用 ActionLink 方法,修改后的视图如下所示。

再次浏览 Browse 的时候,每个专辑应该已经成为了一个链接,如图所示:

时间: 2024-08-28 21:20:30

008-添加数据访问的相关文章

在 ASP.NET 中创建数据访问和业务逻辑层(转)

.NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均与表示层分离.表示层由网站用户有权查看或更改数据的页面组成. ASP.NET 可通过多种方式提供数据访问.业务逻辑和表示形式之间的分离.例如,数据源模型(包括 LinqDataSource 和 ObjectDataSource 等服务器控件)可将表示层与数据访问代码和业务逻辑分离. 另一种模式是将数

数据访问(往数据库添加)

列举往数据库里面添加数据.例子如下 先建个from表单 <form action="addchuli.php" method="post"> <div>水果代号:<input type="text" name="ids" /></div> <div>水果名称:<input type="text" name="name" /

重要!!!实体类、数据访问类

创建两个类: users类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 实体类_数据访问类.App_Code { public class Users { private int _Ids; /// <summary> /// ids /// </summary> public int Ids { get { return _Ids;

.NET Framework 2.0中的数据访问新特性

1. 异步数据访问 ? 支持异步数据编程 ? SqlConnection – BeginOpen – EndOpen ? SqlCommand – BeginExecuteNonQuery – BeginExecuteReader – BeginExecuteXmlReader – EndExecuteNonQuery – EndExecuteReader – EndExecuteXmlReader 2. 多活动结果集(MARS) ? 在 SQL Server 2005 中支持多活动结果集 ?

Spring数据访问之JdbcTemplate

Spring数据访问之JdbcTemplate 使用JdbcTemplate的基本操作步骤 1.引jar包 项目的基本架构 这里重点看实现类的内容 1 package cn.hmy.dao.impl; 2 3 4 import java.util.List; 5 6 import org.springframework.jdbc.core.support.JdbcDaoSupport; 7 8 import cn.hmy.beans.Emp; 9 import cn.hmy.dao.IEmpDa

Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这部分内容需要以下Jar包支持 mysql-connector:MySQL数据库连接驱动,架起服务端与数据库沟通的桥梁: MyBatis:一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架: log4j:Apache的开源项目,一个功能强大的日志组件,提供方便的日志记录: 修改后的pom.xm

PHP-------PDO:数据访问抽象层

PDO:数据访问抽象层 它是用来做数据访问的,和数据库之间连接,执行一些SQL语句 这种方式比之前的,Mysqli的方式功能更大一些 用一张图来说明: 人为写了一条SQL语句,是通过Mysqli的对象(封装好的类),通过Mysql驱动,然后在操作Mysql数据库.这是以前的方式. 如果这条SQL语句,想访问另外一个数据库,不是Mysql了,想用一下Oracle Call数据库或者SQL Server数据库,根据逻辑,应该还要有一个类是专门操作Oracle Call 数据库的类 同一张图来表示:

TP数据访问

重点学习了: 1,ThinkPHP查询数据 2.ThinkPHP添加数据 LianXiController.class.php 1 <?php 2 namespace Home\Controller; 3 use Think\Controller; 4 class LianXiController extends Controller 5 { 6 //添加数据 7 function tj() 8 { 9 10 /* 11 //方法1:(数组) 12 //添加的数组必须为关联数组,key必须为字段

php数据访问数据层

数据访问pdo抽象层 方法一:比较简单点: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta htt

十步优化SQL Server中的数据访问(转载)

原文地址:http://tech.it168.com/a2009/1125/814/000000814758.shtml 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因. 经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表