一,建立简单的Model

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

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

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

如下图所示:

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”,如下图所示:

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

《asp.net mvc3 高级编程》第四章 模型的更多相关文章

  1. 《asp.net mvc3 高级编程》第一章

    以前项目中用过mvc2,虽然mvc4早已出来,但手头只有mvc3的书籍,索性就学学MVC3吧. asp.net mvc 3 概述 (1)友好的试图表达,其中包括新的Razor视图引擎 (2)支持.NE ...

  2. 《asp.net mvc3 高级编程》第二章 控制器

    一.控制器的角色 MVC模式中的控制器(Controller)主要负责响应用户的输入,并且在响应时通常会修改模型(Model).通过这种方式,MVC模式中的控制器主要关注的是应用程序流,输入数据的处理 ...

  3. ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法

    参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...

  4. ASP.NET MVC5 高级编程 第3章 视图

    参考资料<ASP.NET MVC5 高级编程>第5版 第3章 视图 3.1 视图的作用 视图的职责是向用户提供界面. 不像基于文件的框架,ASP.NET Web Forms 和PHP ,视 ...

  5. ASP.NET MVC5 高级编程 第2章 控制器

    参考资料<ASP.NET MVC5 高级编程>第5版 第2章 控制器 控制器:响应用户的HTTP 请求,并将处理的信息返回给浏览器. 2.1 ASP.NET MVC 简介 MVC 模式中的 ...

  6. 《asp.net mvc3 高级编程》第三章 视图

    一.视图的作用 视图的职责是向用户提供界面.从ASP.NET MVC3开始,视图数据也可以通过ViewBag属性访问.例如:ViewBag.Message 就等于ViewData["Mess ...

  7. 【读书笔记】C#高级编程 第四章 继承

    (一)继承的类型 1.实现继承和接口继承 在面向对象的编程中,有两种截然不同的继承类型:实现继承和接口继承. 实现继承:表示一个类型派生于一个基类型,它拥有该基类型的所有成员字段和函数.在实现继承中, ...

  8. UNIX系统高级编程——第四章-文件和目录-总结

    文件系统: 以UNIX系统V文件系统为例: 磁盘分为区,每个分区都有自己的文件系统: ​ i节点是固定长度的记录项,包含了文件的相关信息.目录项包含文件名和i节点号.stat结构中除文件名和i节点编号 ...

  9. unix环境高级编程第四章笔记

    文件和目录 start fstart lstart函数 一旦给出pathname, start函数就返回了与此命名文件有关的信息结构 #include <sys/start> int st ...

随机推荐

  1. 数据结构(动态树):UOJ 207 共价大爷游长沙

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABHwAAAJZCAIAAABUW7XHAAAgAElEQVR4nOy93cstx5Xm2f9TXh2EOe

  2. WebBrowser控件默认使用IE9,IE10的方法

    1,打开注册表 HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER)     SOFTWARE        Microsoft           Internet E ...

  3. python编译环境发掘——从IDLE到sublime到pycharm到Anaconda

    一个好的编译器对于我们处理日常的科研很关键,好的编译器无论是从界面,字体风格,提示,调试等各方面都能从用户角度出发,提供最好的使用体验.Python本身自带的IDLE或者在CMD里进行操作和调试,对于 ...

  4. Android ViewPager PagerAdapter 图片轮播

    ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的View类. ViewPager类需要一个PagerAdapter适配器类给它提供数据. ViewPager ...

  5. JQuery请求WebService返回数据的几种处理方式

    打开自己的博客仔细浏览了一番,发现已经好久没有写博客了,由于最近一直比较忙碌懈怠了好多.默默反省三分钟.......言归正传,现在就对最近在学习webservice的过程中遇到的几种类型的问题中我的理 ...

  6. ping and traceroute(tracert)

    1.ping程序简单介绍 这个程序是Mike Muuss编写的.目的是測试另外一台机子是否可达. 运用的协议就是ICMP.运用的是ICMP的回显应答和请求回显两个类型.曾经呢.能ping通说明可以进行 ...

  7. 【C语言天天练(二一)】内联函数

            引言:调用函数时,一般会由于建立调用.传递參数.跳转到函数代码并返回等花费掉一些时间,C语言的解决的方法是使用类函数宏.在C99中,还提出了第二种方法:内联函数.         内联 ...

  8. Linux如何关闭防火墙和查看防火墙的具体情况

    1.Linux下关闭和开启防火墙 1) 重启后生效 开启: chkconfig iptables on 关闭: chkconfig iptables off 2) 即时生效,重启后失效 开启: ser ...

  9. Reso | The Linux Command Line 的中文版

    http://book.haoduoshipin.com/tlcl/book/zh/ 本书是 The Linux Command Line 的中文版, 为大家提供了多种不同的阅读方式. 中英文双语版- ...

  10. 【JavaScript】我的JavaScript技术总结第一篇——编程细节

    遍历数组 for (var i=0, l=arr.length; i<l; i++) 这样写的一个好处就是让每次循环少一步获取数组对象长度的操作,数组长度越长,价值越明显. 判断变量的真假 if ...