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教程。