起飞网 ASP.NET MVC 5 学习教程目录:
添加控制器
添加视图
修改视图和布局页
控制器传递数据给视图
添加模型
创建连接字符串
通过控制器访问模型的数据
生成的代码详解
使用 SQL Server LocalDB
Edit方法和Edit视图详解
添加查询
Entity Framework 数据迁移之添加字段
添加验证
Details 和 Delete 方法详解
在本节中,我们将使用Entity Framework Code First 数据迁移功能将模型类的改变应用到数据库中。
默认情况下,当我们使用Entity Framework Code First 自动创建一个数据库,像我们之前教程中讲的那样,Code First 添加一个table帮我们跟踪数据库结构是否与模型类同步。如果不同步,Entity Framework 将抛出一个错误,这样更方便我们在开发的时候发现问题,否则只能在运行时通过晦涩的错误来查找了。
为模型更改设置 Code First 数据迁移
在解决方案资源管理器中,删除自动创建的 Movies.mdf 文件。
在工具菜单中,选择“库程序包管理器”>“程序包管理器控制台”:
图1:打开“程序包管理器控制台”菜单项
在“程序包管理器控制台”窗口中输入:Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext
图2:运行命令
Enable-Migrations 命令创建了一个Migrations文件夹和Configuration.cs文件。
图3:新添加的文件
打开 Configuration.cs 文件,使用以下代码替换 Seed 方法:
代码清单1:Seed 方法 - Configruation.cs
protected override void Seed(MvcMovie.Models.MovieDBContext context)
{
context.Movies.AddOrUpdate(i => i.Title,
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
}
使用这段代码的时候,需要添加 using MvcMovie.Models 的引用。
Code First 数据迁移在每次迁移(在程序包管理器控制台中调用 update-database)的时候都会调用Seed方法。
在进行下一步之前,先编译解决方案,否则下一步会出错误。
下一步,为初始化迁移创建一个 DbMigration 类。这次迁移创建一个新数据库,这也是我们为什么要删除之前的数据库的原因。
在“程序包管理器控制台”窗口,输入命令 add-migration Initial 创建初始化迁移。名称“Initial”是随意命名的,它用来命名创建好的迁移文件。
图4:创建初始化迁移
Code First Migrations 创建在Migrations文件夹中创建了一个文件(文件名是 {DateStamp}_Initial.cs ),这个类包含了创建数据库结构的代码。迁移文件的文件名以DateStamp开头是为了更好的排序,打开 {DateStamp}_Initial.cs 文件,它包含了为数据库MovieDB创建Movies表的指令。当你使用下面的命令更新数据库时,{DateStamp}_Initial.cs 文件将会运行并创建数据库结构,然后将执行 Seed 方法将测试数据插入数据库中。
在“程序包管理器控制台”中输入命令 update-database :
图5:执行更新数据库命令
运行应用程序,浏览/Movies 地址,我们在Seed方法中添加的数据如下:
图6:浏览程序
为Movie模型添加Rating字段
上面的内容一直在介绍如何进行数据迁移,现在开始为Movie类添加Rating字段,打开Movie.cs 文件,为它添加一个Rating字段,添加后的代码如下:
代码清单2:添加Rating字段后的Movie类
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
[Display(Name = "Release Date")]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
public string Rating { get; set
; }
}
编译解决方案。
现在我们已经更新了Movie类,你还需要修改\Views\Movies\Index.cshtml 和 \Views\Movies\Create.cshtml 视图。修改后的代码如下:
代码清单3:修改后的Index.cshtml
@model IEnumerable
@{
ViewBag.Title = "Index";
}
Index
@Html.ActionLink("Create New", "Create")
@using (Html.BeginForm("Index", "Movies", FormMethod.Get))
{
Genre: @Html.DropDownList("movieGenre", "All")
Title: @Html.TextBox("SearchString")
}
@Html.DisplayNameFor(model => model.Title)
| @Html.DisplayNameFor(model => model.ReleaseDate)
| @Html.DisplayNameFor(model => model.Genre)
| @Html.DisplayNameFor(model => model.Price)
| > @Html.DisplayNameFor(model => model.Rating) | |
---|---|---|---|---|---|
@Html.DisplayFor(modelItem => item.Title)
| @Html.DisplayFor(modelItem => item.ReleaseDate)
| @Html.DisplayFor(modelItem => item.Genre)
| @Html.DisplayFor(modelItem => item.Price)
| > @Html.DisplayFor(modelItem => item.Rating) | @Html.ActionLink("Edit", "Edit", new { id = item.ID }) | @Html.ActionLink("Details", "Details", new { id = item.ID }) | @Html.ActionLink("Delete", "Delete", new { id = item.ID })
|
代码清单3:修改后的Create.cshtml
@model MvcMovie.Models.Movie
@{
ViewBag.Title = "Create";
}
Create
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
发表评论