一,建立简单的Model
在Models文件夹上右击鼠标,选择“添加”,“类”,如下图所示:
建立三类相关联的类代码如下:
class="code_img_closed" src="/Upload/Images/2013101723/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('d802ad59-d867-469f-b02b-175f1b975cea',event)" src="/Upload/Images/2013101723/2B1B950FA3DF188F.gif" alt="" />1 public class Album 2 { 3 public virtual int AlbumId { get; set; } 4 5 public virtual int GenreId { get; set; } 6 7 public virtual int ArtistId { get; set; } 8 9 public virtual string Title { get; set; } 10 11 public virtual decimal Price { get; set; } 12 13 public virtual string AlbumArtUrl { get; set; } 14 15 public virtual Genre Genre { get; set; } 16 17 public virtual Artist Artist { get; set; } 18 }View Code
1 public class Artist 2 { 3 public virtual int ArtistId { get; set; } 4 5 public virtual string Name { get; set; } 6 }View Code
1 public class Genre 2 { 3 public virtual int GenreId { get; set; } 4 5 public virtual string Name { get; set; } 6 7 public virtual string Description { get; set; } 8 9 public virtual List<Album> Albums { get; set; } 10 11 }View Code
二、构建基架
1,基架的概念
asp.net mvc 中的基架可以为应用程序的创建、读取、更新和删除功能生成所需的样板代码。基架模板检测模型类(如刚才建的几个类)的定义,然后生成控制器以及该控制器的关联视图。基架知道如何命名控制器、命名视图以及每个组件需要执行什么代码,也知道在应用程序中如何放置这些以使应用程序正常工作。
在ASP.NET MVC3中共有三个基架模板可供选择,如下:
空控制器:
控制器模板会向Controllers文件夹中添加一个具有指定名称且派生自Controller的类(控制器)。这个控制器带有的唯一所做就是Index操作,然后返回一个默然ViewResult实例的代码之外,没有其他任何代码。这个模板不会生成任何视图。
包含空的读/写操作的控制器:
这个模板会向项目中添加一个带有Index、Details、Create、Edit和Delete操作的控制器。虽然控制器内部的操作不是完全空白,但是他们不会执行任何有实际意义的操作,除非向其中添加自己的代码并为它们创建视图。
包含读/写操作和视图的控制器(使用Entity Framework)
这个模板不仅生成带有整套Index、Details、Create、Edit和Delete操作的控制器以及需要的所有相关视图,而且还生成了与数据库交互(持久保存数据到数据库或从数据库中读取数据)的代码。为了让模板产生合适的代码,需要选择一个模型类,基架会检测所选择模型的所有属性,然后利用这些信息来创建控制器、视图和数据库访问代码。
如下图所示:
DBA865846290.jpg" alt="" />
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的信息:
1 public class StoreManagerContext : DbContext 2 { 3 4 public DbSet<Album> Album { get; set; } 5 6 public DbSet<Artist> Artist { get; set; } 7 }View Code
使用先前的数据上下文,可以通过使用LINQ查询,以字母顺序检索出所有的信息,如下代码所示:
1 var db=new StoreManagerContext(); 2 3 var allAlbums=from album in db.Albums 4 orderby album.Title ascending 5 select album;View Code
接着上图所示创建控制器名为“StoreManagerController”,模板选择为“包含读/写操作和视图的控制器(使用Entity Framework)”,选择一个模型类,如“Album (StoreManager.Models)”,数据上下文,选择“新建数据上下文”,视图选择“Razor”,如下图所示:
点击“添加”按钮后,基架将在项目的多个位置添加新文件,会在Models文件添加“StoreManagerContext.cs”文件。想要访问数据库,只需要实例化这个数据上下文类。会在StoreManagerController中添加CRUD等操作,然后根据这些会自动生成对应的视图。