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(, 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(, ErrorMessage = "标题不能超过250个字符")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; } [DisplayName("密码")]
[Required(ErrorMessage = "必须输入一个密码")]
[Description("请输入你的登录密码")]
[MaxLength(, ErrorMessage = "密码不能超过40个字符")]
[DataType(DataType.Password)]
public string PassWord { get; set; } [DisplayName("姓名")]
[Required(ErrorMessage = "请输入你的真实姓名")]
[Description("请输入你的真实姓名,让更多人了解你")]
[MaxLength(, ErrorMessage = "作者姓名不能超过10个字符")]
public string Name { get; set; } [DisplayName("身份证")]
[Required(ErrorMessage = "必须输入身份证号码")]
[Description("身份证是你找到密码的唯一依据")]
[MaxLength(, 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教程。
MVC中使用Entity Framework 基于方法的查询学习笔记 (一)的更多相关文章
- MVC中使用Entity Framework 基于方法的查询学习笔记 (二)
解释,不解释: 紧接上文,我们在Visual Studio2012中看到系统为我们自动创建的视图(View)文件Index.cshtml中,开头有如下这句话: @model IEnumerable&l ...
- MVC中使用Entity Framework 基于方法的查询学习笔记 (三)
紧接上文,我们已经学习了MVC数据上下文中两个常用的类,这两个类承载着利用函数方式进行数据查询的全部内容,我们既然已经了解了DbSet<TEntity> 是一个泛型集合,并且实现了一些接口 ...
- Entity Framework 基于方法的查询语法
实体框架(Entity Framework )是 ADO.NET 中的一套支持开发面向数据的软件应用程序的技术. LINQ to Entities 提供语言集成查询 (LINQ) 支持,它允许开发 ...
- asp.net MVC中使用entity framework出现从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值”的处理
方法一: 使用DateTime类型的字段在作为参数传入到数据库前记得赋值,并日期要大于1753年1月1日. 方法二: 将DateTime类型的字段修改为DateTime?类型,由于可空类型的默认值都是 ...
- 在MVC中使用dotless后台动态解析LESSCSS的学习笔记
通过学习LessCSS,我们知道,Less是需要通过编译才能生成 .css 文件,主要使用三种方式进行编译: 1)使用第三方编译工具,在项目发布前编译好放在项目中. 2)在浏览器端解析执行,需要引用 ...
- MVC中使用EF(1):为ASP.NET MVC程序创建Entity Framework数据模型
为ASP.NET MVC程序创建Entity Framework数据模型 (1 of 10) By Tom Dykstra |July 30, 2013 Translated by litdwg ...
- 在Oracle中使用Entity Framework 6 CodeFirst
项目中需要将系统从SQLServer数据库迁移到Oracle上.由于原大部分数据访问操作都是通过包装了Entity Framework的统一访问入口实现的,所以需要研究Entity Framework ...
- Asp.Net MVC 模型(使用Entity Framework创建模型类) - Part.1
这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...
- 源码学习之ASP.NET MVC Application Using Entity Framework
源码学习的重要性,再一次让人信服. ASP.NET MVC Application Using Entity Framework Code First 做MVC已经有段时间了,但看了一些CodePle ...
随机推荐
- 实现数据库的跨库join
功能需求 首先要理解原始需求是什么,为什么要跨库join.举个简单的例子,在日志数据库log_db有一份充值记录表pay_log,里面的用户信息只有一个userid:而用户的详细信息放在主库main_ ...
- SASS 入门笔记
参考资料: SASS 用法指南 SASS 语法 Sass Basics SASS_REFERENCE sass 有两种后缀名文件:一种后缀名为 sass,不使用大括号和分号:另一种就是我们这里使用的 ...
- markdown语法说明
1.先写一个标题 # 一级标题.相当于 <h1> ## 二级标题.相当于 <h2> ### 三级标题.相当于 <h3> #### 四级标题.相当于 <h4&g ...
- Android工程的编译过程
现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统.自动生成发布文件等等.这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的每一步都做了什么,需要 ...
- PHP学习总结
<?php /* PHP简介: PHP是什么:PHP是一种创建动态交互性站点的强有力的服务器端脚步语言 PHP代表Hypertext Preprocessor PHP是一种使用广泛的开源的脚本语 ...
- 使用stylelint对CSS/Sass做代码审查
对样式审查?很少人会这么做吧,但实际上开发者应该有这样的态度,尤其是不同团队多人开发时,这一点尤为重要. 在本文中,我将陈述两点:一是为什么我们需要对样式进行审查,二是如何将审查工具融合到整体的构建流 ...
- Jetson ARM SeetaFace编译
SeetaFace简介 SeetaFace依赖于OpenCV,对于Tegra on Ubuntu,Nvidia提供libopencv4tegra并且可以使用Cuda加速. 准备工作 1.阅读OpenC ...
- MVC POST在ACTION上进行多个模型的数据绑定
首先声明,接下来的东西并不符合本人认同的严谨的MVC模式. 用MVC做项目的过程中,越来越多的用到不严谨的MVC编程. 比如,在"cshtml"文件中写: @Html.Raw(DB ...
- Codis——分布式Redis服务的解决方案
Codis——分布式Redis服务的解决方案 之前介绍过的 Twemproxy 是一种Redis代理,但它不支持集群的动态伸缩,而codis则支持动态的增减Redis节点:另外,官方的redis 3. ...
- 在QtCreator中使用doxygen
接触Doxygen后,认识到其强大之处,一口气将之前的烂代码重构了一遍,所有的文件头,函数注释等等都是手动添加注释.在keil中可以看到其对JavaDoc风格的注释有高亮,非常好看.但是keil这个I ...