zoukankan      html  css  js  c++  java
  • 《asp.net mvc3 高级编程》第四章 模型

    一,建立简单的Model

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

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

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

    如下图所示:

    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等操作,然后根据这些会自动生成对应的视图。

  • 相关阅读:
    jQuery插件编写步骤详解
    原生JavaScript实现JSON合并(递归深度合并)
    js原型链继承及调用父类方法
    codefind.pl
    如何为属性是disabled的表单绑定js事件
    平假名、片假名转换
    #和##在宏替换中的作用
    Perl实用中文处理步骤(修改版)
    Perl Unicode全攻略
    nio DirectByteBuffer如何回收堆外内存
  • 原文地址:https://www.cnblogs.com/liangdaye/p/3375087.html
Copyright © 2011-2022 走看看