赵增敏,吴 洁,唐惠康
ZHAO Zeng-min, WU Jie, TANG Hui-kang
(河南信息工程学校,郑州 450008)
开发ASP.NET MVC应用程序时,通常是首先创建数据库,然后通过编写代码来实现数据库访问。这种开发模式已得到了广泛应用,但也存在着性能差、效率低等缺点。随着ASP.NET Entity Framework 4.1的发布,推出了一种称为Code First的新开发模式,可从代码开始数据库应用开发。本文从模型、控制器和视图3个方面对这种开发模式进行了详细研究。
在VS2010中新建一个项目,选择Visual C#语言,选择ASP.NET MVC 3 Web应用程序模板,依次选择Internet应用程序和Razor视图引擎。对类库EntityFramework的引用将自动添加到项目中。
创建实体模型是Code First开发的关键所在。对于每个实体模型,均需创建一个类。这些类不需要派生自任何Entity Framework类或其他基类,也不必实现任何接口。在本文中定义了产品和产品类别两个实体模型类:
public class Product {
public int ProductID {get; set;}
public int CategoryID {get; set;}
public string ProductName {get; set;}
public decimal UnitPrice {get; set;}
public int UnitsInStock { get; set; }}
public class Category {
public int CategoryID {get; set;}
public string CategoryName {get; set;}}
为了保证表完整性,每个表中都必须有一个主键,这就需要在某个列或多个列的组合上定义一个PRIMARY KEY约束。
在Code First模式下,可通过属性名称来“推测”主键:声明实体模型类时若将某属性命名为ID或<类名>ID,则该属性将被推断为主键。主键检测与大小写无关。若主键为int、long或short类型,还会注册为标识列。例如,Product类的ProductID属性和Category类的CategoryID就属于这种情况,它们既是主键又是标识列。
为了保证表与表之间的数据完整性,要求主表中主键与从表中外键是一致的,这需要在从表上创建FOREIGN KEY约束。
在Code First模式下,可通过在相关联的类中添加虚属性来实现主外键关系。例如,本文中的Product类和Category类分别表示产品和产品类别,两者之间显然存在着关联。为了实现这种关联,可在Product类中添加Category虚属性:
public virtual Category Category {get; set;}
同时在Category类中添加Products虚属性:
public virtual ICollection<Product> Products{get; set;}
这样,将会自动创建主外键关系来管理这些关联,还会在后台延迟加载数据。
在Code First开发模式下,数据验证可以利用System. ComponentModel.DataAnnotations命名空间中提供的一组特性类来实现。这些特性类也称为数据标注,可用于定义实体模型类中各个数据字段的行为。对于同一个属性可同时应用多个标注。
在下面的示例中,对ProductName字段应用了Display和Required标注,并指定了中文名称和未输入值时显示的错误信息。
[Display(Name="产品名称")]
[Required(ErrorMessage="产品名称不能为空")]
public string ProductName {get; set;}
为了将实体模型类映射到数据库中,必须创建数据上下文类。该类必须满足下列要求:派生自System.Data. Entity.DbContext;对于每个实体集定义一个可读写属性;每个属性均为System.Data.Entity.DbSet<T>类型,其中T为实体的类型。
在第四纪和新近纪土体中,天然孔隙比、压缩系数、固结速率等物理力学指标与地面沉降有着密切的联系,一般随深度增加,黏性土体压缩性降低,而砂性土体的密
在本文中,创建了一个名称为StoreContext的数据上下文类,并定义了两个实体集属性,代码如下:
using System.Data.Entity;
public class StoreContext : DbContext {
public DbSet<Product> Products {get; set;}
public DbSet<Category> Categories {get; set;}}
传统模式下,可通过ADO.NET Connection对象实现数据库连接。使用Code First开发模式时,将会自动在SQL Server Express实例中创建一个与DbContext名称相同的数据库,并且自动连接到该数据库。也可以在项目的Web.config文件中添加连接字符串,以指定数据提供程序和现有数据库的位置。
CRUD是指在进行数据处理时的增加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作,这些操作需要对每个实体创建控制器和相应视图来实现。安装ASP.NET MVC 3工具更新后,VS2010中的“添加控制器”对话框得到增强,提供了更多基架选项,可快速生成控制器和视图。
为了实现对数据库的各种基本操作,需要对每个实体创建一个控制器,每个控制器包含一组操作方法。
若要添加控制器,可右击“解决方案资源管理器”中的Models文件夹,然后选择“添加”→“控制器”,当弹出“添加控制器”对话框时,指定控制器名称,设置基架选项,选择“包含读/写操作和视图的控制器(使用Entity Framework)”,选择模型类、数据上下文类及Razor视图。
在控制器类中,需要创建一个数据上下文对象,并通过各种操作方法来实现数据库访问。这些操作方法包括:用于呈现数据的Index方法;用于添加数据的Create方法;用于修改数据的Edit方法;用于删除数据的Delete和DeleteConfirmed方法。在正确创建实体模型的前提下,VS2010将会自动生成这些操作方法的代码。
操作方法分为两类:一类仅用于处理HTTP GET请求,另一类仅用于处理HTTP POST请求。默认情况下操作方法可用于HTTP GET请求。若某操作方法是在提交表单时调用的,则需要对该方法应用HttpPost特性。对于DeleteConfirmed方法,除了应用HttpPost特性之外,还要应用ActionName("Delete")特性以指定操作名称。
对于有参操作方法,可向其传递实体ID或实体对象本身作为参数。实体ID可在单击超链接或提交表单时传递到方法中。实体对象在提交表单时传递到方法中,其属性值由相应表单域确定。
除DeleteConfirmed方法外,产品控制器类中的所有其他操作方法都要求创建相应视图。若在添加控制器时选择“包含读/写操作和视图的控制器(使用Entity Framework)”模板和Razor视图,则会自动生成视图。
5.3.1 使用@model指令引用强类型模型
@model指令是ASP.NET MVC 3提供的一项新功能,它实现了视图对强类型模型的引用,以便在视图模板中直接访问从控制器类中传递过来的模型。
5.3.2 呈现HTML控件
通过@model指令引用所需的强类型模型后,即可使用System.Web.Mvc.Html命名空间中的相关类来呈现各种HTML控件,并使用扩展方法对这些控件进行设置。
Code First 模式的关键是创建实体模型类并实现数据完整性和数据验证。有了合用的实体模型,即可借助于VS2010 快速生成控制器和视图,从而实现CRUD 功能。
[1] Vincent-Philippe Lauzon. Entity Framework 4.1: Basics(1). http://vincentlauzon.wordpress.com/2011/04/03/entity-framework-4-1-basics-1/.
[2] Microsoft. ASP.NET MVC 3 Tools Update 发行说明.