《asp.net mvc3 高级编程》第四章 模型

时间:2023-03-09 17:31:02
《asp.net mvc3 高级编程》第四章 模型

一,建立简单的Model

在Models文件夹上右击鼠标,选择“添加”,“类”,如下图所示:

《asp.net mvc3 高级编程》第四章 模型

《asp.net mvc3 高级编程》第四章 模型

建立三类相关联的类代码如下:

 public class Album
{
public virtual int AlbumId { get; set; } public virtual int GenreId { get; set; } public virtual int ArtistId { get; set; } public virtual string Title { get; set; } public virtual decimal Price { get; set; } public virtual string AlbumArtUrl { get; set; } public virtual Genre Genre { get; set; } public virtual Artist Artist { get; set; }
}
  public class Artist
{
public virtual int ArtistId { get; set; } public virtual string Name { get; set; }
}
     public class Genre
{
public virtual int GenreId { get; set; } public virtual string Name { get; set; } public virtual string Description { get; set; } public virtual List<Album> Albums { get; set; } }

二、构建基架

1,基架的概念

asp.net mvc 中的基架可以为应用程序的创建、读取、更新和删除功能生成所需的样板代码。基架模板检测模型类(如刚才建的几个类)的定义,然后生成控制器以及该控制器的关联视图。基架知道如何命名控制器、命名视图以及每个组件需要执行什么代码,也知道在应用程序中如何放置这些以使应用程序正常工作。

在ASP.NET MVC3*有三个基架模板可供选择,如下:

空控制器:

控制器模板会向Controllers文件夹中添加一个具有指定名称且派生自Controller的类(控制器)。这个控制器带有的唯一所做就是Index操作,然后返回一个默然ViewResult实例的代码之外,没有其他任何代码。这个模板不会生成任何视图。

包含空的读/写操作的控制器:

这个模板会向项目中添加一个带有Index、Details、Create、Edit和Delete操作的控制器。虽然控制器内部的操作不是完全空白,但是他们不会执行任何有实际意义的操作,除非向其中添加自己的代码并为它们创建视图。

包含读/写操作和视图的控制器(使用Entity Framework)

这个模板不仅生成带有整套Index、Details、Create、Edit和Delete操作的控制器以及需要的所有相关视图,而且还生成了与数据库交互(持久保存数据到数据库或从数据库中读取数据)的代码。为了让模板产生合适的代码,需要选择一个模型类,基架会检测所选择模型的所有属性,然后利用这些信息来创建控制器、视图和数据库访问代码。

如下图所示:

《asp.net mvc3 高级编程》第四章 模型

2、基架和实体框架

EF4.1之后开始支持代码优先的开发风格。代码优先是指可以在不创建数据库模式、也不打开Vs设计器的情况下在SQL中存储或检索信息。可以编写纯C#类,因为EF知道如何将这些类的实例存储到正确的位置。将模型对象中的所有属性都写成虚拟属性,能给EF提供一个指向纯C#类集的钩子(Hook),并为EF启用了一些特性,如高效的修改跟踪机制。实体框架需要知道模型属性值的修改时刻,因为它要在这一时刻生成并执行一个SQL UPDATE语句,使这些改变和数据库保持一致。

代码优先的约定:如果想把一个Album类型的对象存储在数据库中,那么EF就假设是把数据存储在数据库中一个名称Albums的表中;如果要存储的对象中有一个名为ID的属性,那么EF就假设这个属性值就是主键值,并把这个值赋给SQL中对应的自动递增(标识)键列。

DbContext:当使用EF的代码优先方法时,需要使用从EF的DbContext类派生的一个类来访问数据库。该派生类具有一个或多个DbSet<T>类型的字段,类型DbSet<T>中的每一个<T>代表一个想要持久保存的对象。例如下面的类就可以用来存储和检索Album和Artist的信息:

  public class StoreManagerContext : DbContext
{ public DbSet<Album> Album { get; set; } public DbSet<Artist> Artist { get; set; }
}

使用先前的数据上下文,可以通过使用LINQ查询,以字母顺序检索出所有的信息,如下代码所示:

 var db=new StoreManagerContext();

 var allAlbums=from album in db.Albums
orderby album.Title ascending
select album;

接着上图所示创建控制器名为“StoreManagerController”,模板选择为“包含读/写操作和视图的控制器(使用Entity Framework)”,选择一个模型类,如“Album (StoreManager.Models)”,数据上下文,选择“新建数据上下文”,视图选择“Razor”,如下图所示:

《asp.net mvc3 高级编程》第四章 模型

点击“添加”按钮后,基架将在项目的多个位置添加新文件,会在Models文件添加“StoreManagerContext.cs”文件。想要访问数据库,只需要实例化这个数据上下文类。会在StoreManagerController中添加CRUD等操作,然后根据这些会自动生成对应的视图。