MVC中使用Entity Framework 基于方法的查询学习笔记 (一)

     EF中基于方法的查询方式不同于LINQ和以往的ADO.NET,正因为如此,有必要深入学习一下啦。闲话不多说,现在开始一个MVC项目,在项目中临床学习。

创建MVC项目

1.“文件”--“新建项目”--“模板”--“Web”--“ASP.NET MVC4应用程序”,创建一个项目名称为 GuestBook 的MVC4项目

2.在文件目录的中Models目录中新建两个Model类

Book.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace GuestBook.Models
{
    [DisplayName("留言板")]
    public class Book
    {
        [Key]
        public int Id { get; set; }

        [DisplayName("正文")]
        [Required(ErrorMessage = "你需要输入一点内容哦")]
        [MaxLength(250, ErrorMessage = "作者不能超过250个字符")]
        public string Body { get; set; }

        [DisplayName("日期")]
        [Required]
        public DateTime PublishOn { get; set; }

        [Required]
        public virtual User User { get; set; }
    }
}

User.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace GuestBook.Models
{
    [DisplayName("用户")]
    [DisplayColumn("Name")]
    public class User
    {
        [Key]
        public int Id { get; set; }

        [DisplayName("用户名")]
        [Required(ErrorMessage = "请输入常用Email地址")]
        [Description("我们将使用该Email地址作为你的登录帐号")]
        [MaxLength(250, ErrorMessage = "标题不能超过250个字符")]
        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }

        [DisplayName("密码")]
        [Required(ErrorMessage = "必须输入一个密码")]
        [Description("请输入你的登录密码")]
        [MaxLength(40, ErrorMessage = "密码不能超过40个字符")]
        [DataType(DataType.Password)]
        public string PassWord { get; set; }

        [DisplayName("姓名")]
        [Required(ErrorMessage = "请输入你的真实姓名")]
        [Description("请输入你的真实姓名,让更多人了解你")]
        [MaxLength(10, ErrorMessage = "作者姓名不能超过10个字符")]
        public string Name { get; set; }

        [DisplayName("身份证")]
        [Required(ErrorMessage = "必须输入身份证号码")]
        [Description("身份证是你找到密码的唯一依据")]
        [MaxLength(18, ErrorMessage = "身份证不能超过18个字符")]
        [DataType(DataType.Password)]
        public string PeopleID { get; set; }

        [DisplayName("注册日期")]
        [Required]
        public DateTime RegisterOn { get; set; }

        public virtual ICollection<Book> Books { get; set; }
    }
}

 

3.创建一个数据上下文类

MVCGuestBookContext.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;//

namespace GuestBook.Models
{
    public class MVCGuestBookContext : DbContext
    {
        public MVCGuestBookContext()
            : base("name=DefaultConnection")
        {
        }

        public DbSet<User> Users { get; set; }
        public DbSet<Book> Books { get; set; }
    }
}

 

4.创建一个控制器

HomeController.cs:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using GuestBook.Models;

namespace GuestBook.Controllers
{
    public class HomeController : Controller
    {
        private MVCGuestBookContext db = new MVCGuestBookContext();

        public ActionResult Index()
        {
            var data = db.Books.ToList();
            return View(data);
        }
    }
}

 

5.右键 Index 这个动作(Action) 右键菜单点击 “添加视图” 在弹出的对话框中 “视图引擎” 选择 Razor, “模型类”  选择刚才创建的Book,“支架模板” 选择List,然后创建一个视图(view),

展开目录的Views中可以看到一个基于Home控制器创建的文件夹Home,在文件夹下可以看到一个 Index.cshtml 文件,该文件定义如下:

@model IEnumerable<GuestBook.Models.Book>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Body)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.PublishOn)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Body)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PublishOn)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
            @Html.ActionLink("Details", "Details", new { id=item.Id }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.Id })
        </td>
    </tr>
}

</table>

该文件详细语法会在以后章节中介绍,可以看出该文件似乎不是一个标准的Html文件。这是因为我们刚才在创建视图时勾选了 “使用布局或母版页” 而使用了默认的母版机制。

在MVC中使用了类似母版页的机制,我们打开 _ViewStart.cshtml 文件可以看到如下定义:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

这个定义指向了一个默认的母版,并且在MVC中,在没有单独指明使用那个母版的时候默认都会使用这个母版页,我们打开这个母版页面 ~/Views/Shared/_Layout.cshtml

,可以看到全部的HTML母板代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
</head>
<body>
    @RenderBody()

    @Scripts.Render("~/bundles/jquery")
    @RenderSection("scripts", required: false)
</body>
</html>

在这个母板页中,使用了填入方式定义了一些类似@RenderBody() 的方法,用于填入内容页,我们可以像以往一样修改为我们想要的方式,接着,我们运行程序,默认的我们已经可以看到系统为我们创建的标准列表页面。

    题外话:也许,你会对所产生的网址有迷惑,但是,当你熟悉了MVC的网址路由,这个就明白了,当然,这些不是我讲的重点,重点内容将在下节呈现。还有就是,以上这种构建程序的方式使用的是Entity Framework 的CodeFirst 开发方式,在运行成功后会自动生成数据库,更多细节内容,请阅读MVC教程。

    

posted @ 2013-10-30 11:16  Yao,Mane  阅读(1434)  评论(1编辑  收藏  举报