数据库上下文
用于处理获取、存储、更新数据库中的实例。需要继承实体框架DbContext。
using MvcMovie.Models; using System.Data.Entity; namespace MvcMovie.DAL { public class MovieDBContext:DbContext { public DbSet<Movie> Movies { get; set; } } }
DbSet<Movie>是数据库实体,数据库上下文操作的就是DbSet的实体。
数据库上下文默认找与类名相同的连接字符串,例如上面实例查找的字符串为:MovieDBContext。
也可以指定链接字符串,例如我们现在指定连接字符串名称为:MovieDBContext
public MovieDBContext() : base("MovieDBContext") { }
LocalDB
LocalDB是轻量级的SqlServer数据库引擎。LocalDB运行中的SQL Server Express使您能够使用数据库的.mdf文件作为特殊的执行模式。
链接字符串不会自动创建,下面我们指定链接字符串,使用LocalDB这种轻量级的数据库引擎。修改web.config中的connectionStrings
<add name="MovieDBContext" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Movies.mdf;Integrated Security=True" providerName="System.Data.SqlClient" />
生成增删改查
我们有了模型和数据库上下文,现在我们创建一个自带的增删改查。
添加控制器-->包含视图的MVC5控制器(使用EF)-->选择模型与上下文 --> 点击创建
需要生成一下解决方案。
现在一个CURD的例子,就生成完毕了。
生成以后会在App_Data里面创建.mdf数据库。
模型的操作
整理一下模型里面所使用到的特性 Attribute。
命名空间:using System.ComponentModel.DataAnnotations;
MSDN: ComponentModel.DataAnnotations
ComponentModel.DataAnnotations.Schema
[Display(Name = "时间")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] public DateTime ReleaseDate { get; set; }
Display 指定可本地化的字符串。就是显示的内容,配合@Html.DisplayNameFor。
DataType 指定要与数据字段关联的附加类型的名称。可以修改页面的输入验证,例如上面修改成时间,页面就变成时间空间。配合@Html.EditorFor。
DisplayFormat 指定 ASP.NET 动态数据如何显示数据字段以及如何设置数据字段的格式。显示格式与是否显示。配合@Html.EditorFor。
Required 指定需要数据字段值。界面上指定不为空等。
HttpPost 指定某个操作支持 POST HTTP 方法。配合@using (Html.BeginForm()){ }
ValidateAntiForgeryToken 表示用于阻止伪造请求的特性。配合@Html.AntiForgeryToken()
Bind 用于提供有关应如何进行模型绑定到参数的详细信息。防止黑客的一个机制。[Bind(Include = "ID,Title,ReleaseDate,Genre,Price")] Movie movie 只有Bind有的属性,才能使用。
主键 默认主键为实体的ID或者类名+ID,例如Status类,主键是ID 或 StatusID
视图的操作
先用一个修改页面的部分,来逐个讲解基础的页面内容。
@using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.ValidationSummary(true, "", new { @class = "text-danger" }) @Html.HiddenFor(model => model.ID) <div class="form-group"> @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Save" class="btn btn-default" /> </div> </div> }
@using (Html.BeginForm()) 表单使用 POST 方法,并由视图的操作方法处理请求
@Html.AntiForgeryToken() 生成一个隐藏的窗体字段(防伪标记),在提交窗体时将验证此字段。配合ValidateAntiForgeryToken
@Html.ValidationSummary() 返回验证信息。控制器返回 ModelState.AddModelError("", "错误"); 前端显示。
@Html.HiddenFor() 为由指定表达式表示的对象中的每个属性返回对应的 HTML 隐藏 input 元素。
@Html.LabelFor() 返回Label元素
@Html.EditorFor() 返回可以修改的元素,模型中DataType可定义类型,此处显示对应的类型。
@Html.ValidationMessageFor() 为由指定表达式表示的每个数据字段的验证错误消息返回对应的 HTML 标记。模型特性可以定义错误信息。
@Html.DropDownList() 返回单选 Select 元素
ViewBag 视图包,可以定义任意属性并在页面访问他,例如我定义一个下拉框,然后页面访问他。
//视图 @Html.DropDownList("movieGenre", "All") //控制器 ViewBag.movieGenre = new SelectList(GenreList);
控件定义的名称会自动加载对应的ViewBag。
迁移模型更改
首先启用迁移,从程序包控制器输入:Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext 选择数据库上下文。
此时会生成一个文件,Migrations-->Configuration.cs
可以在这里面设置数据库种子,当数据库生成以后会自动初始化数据
protected override void Seed(MVC.Models.MoiveDBContext context) { context.Movies.AddOrUpdate(i => i.Title, new Movie { Title = "When Harry Met Sally", ReleaseDate = DateTime.Parse("1989-1-11"), Genre = "Romantic Comedy", Rating = "PG", Price = 7.99M } );
创建初始迁移,add-migration Initial。Initial是迁移文件的名称。
此时会生成一个迁移文件,Migrations-->*Initial。这个迁移文件会包含需要修改的地方。
public override void Up() { CreateTable( "dbo.Movies", c => new { ID = c.Int(nullable: false, identity: true), Title = c.String(), ReleaseDate = c.DateTime(nullable: false), Genre = c.String(), Price = c.Decimal(nullable: false, precision: 18, scale: 2), }) .PrimaryKey(t => t.ID); } public override void Down() { DropTable("dbo.Movies"); }
创建数据库和种子。update-database。会创建数据库并自动执行Seed里面的方法。