ASP.NET MVC5 入门九——添加新字段、数据库迁移

在Code First开发中,不可能一开始创建的数据库类就一直不变可能随着需求或者其他原因要做调整。假设我们在原有的Movies里面添加一个评级属性。

image

然后我们运行下看看。

image

异常了!注释掉刚才添加的代码,在运行看看:

image

发现可以访问,这是因为当EF CodeFirst的数据模型发生异动时,默认会引发一个 InvalidOperationException异常。有个解决方法是,在Global.asax 里面的Application_Start方法加上 一个 SetInitializer方法,这个方法会让数据库删除在重新创建。就是因为如此,有了大量的测试数据显然不能用这个方法!

使用Code First数据库迁移

首先,我们删除系统自动创建的Movies.mdf文件。如下图,如果在App_Data 里面没有看见,请单击显示所有文件图标。

image

然后进入(PM)软件包管理控制台 (视图——》其他窗口——》程序包管理控制台)输入以下指令:Enable-Migrations

image

出现错误那是因为项目中有多个数据类别,所以需要选择一个。重新输入命令:Enable-Migrations –ContextTypeName MVC5DEMO.Models.MovieDBContext 来指定需要迁移的数据库上下文。image

好了,我们会发现项目中多了一个文件夹(Migrations)和Configuration.cs文件。

image

然后我们根据注释的提示,修改下Seed方法的内容为如下:

protected override void Seed(MVC5DEMO.Models.MovieDBContext context)
        {
            context.Movie.AddOrUpdate(i => i.Title,
                new Movie {
                Title = "虎胆龙威",
                ReleaseDate=DateTime.Parse("2013-03-16"),
                Genre="动作",
                Price=120},
                new Movie {Title = "致青春",
                ReleaseDate=DateTime.Parse("2013-04-26"),
                Genre="爱情",
                Price=60} ,new Movie {Title = "中国合伙人",
                ReleaseDate=DateTime.Parse("2013-05-18"),
                Genre="剧情",
                Price=90} ,new Movie {Title = "小时代",
                ReleaseDate=DateTime.Parse("2013-06-27"),
                Genre="脑残",
                Price=30} 
                );
        }

添加完成后请按下 CTRL-SHIFT-B 生成解决方案

image

然后我们创建一个数据库迁移的版本,就是初始版本。在管理控制台输入 add-migration Initial 其中Initial可以随便取名。

image

image 文件夹下面多了一个日期+Initial.cs 的文件。

接着我们在PM(程序包管理控制台)输入 Update-Database 指令。

image

这个指令会检测刚才那个cs文件,里面包含数据库的结构的说明,然后运行 Seed里面的方法填充数据。然后我们F5运行看看。

image

一切正常!

把新属性添加到Model

接下来我们给电影模型添加一个分级功能,类似《小时代》少儿不宜!把我们刚刚注释掉的再反注释,然后重新生成下。生成完后还需要修改几个地方,如果你有自己设定Bind属性,还要把新的字段添加进去,同时要去视图修改下。我们去Index.cshtml修改下:

image

红色框框就是新增加的2处。同样的,Create.cshtml也需要添加。

image

好了之后我们运行看看。

image

出现错误了!那是因为现在的模型已经多了一个字段,而数据库还没有变化。可以用上文提到的让系统自动把数据库砍掉在重新生成,或者自己手动修改数据库。不过这些都不是最优的,最好的是使用Code First 的数据库迁移。第一步,更改Seed文件,在默认的那些测试数据中添加分级信息。

image

然后再PM里面输入  add-migration addRating (名字: addRating 可以随意,最好有意义)

image

会发现多了一个up和down方法,记录着数据库的变动。接着我们生产解决方案,然后再PM输入:Update-database 命令。然后运行看看:

image

image

评级出现了,我们点击 Create New 看看:

image

image

一切正常,都能添加。但是这样还不够智能,接下来我们设置自动数据库迁移。

自动数据库迁移

在Global.asax里面的 Application_Start方法加上以下代码:

image

这样以后一旦数据库模型变化,就能自动进行升级。

下一步:添加验证。

《ASP.NET MVC5 入门九——添加新字段、数据库迁移》有2个想法

  1. 再seed中插入中文数据,在数据库localdb中查看显示的是乱码,f5网页查看也是乱码应该如何解决?

发表评论

电子邮件地址不会被公开。