ASP.NET MVC系列:为已有模型添加新的属性
在模型类Movie中添加一个新的属性Rating
重新编译重新生成解决方案,快捷键Ctrl+Shift+B;然后对去对应的视图添加新的数据,如Index.cshtml中
编辑完成,运行之后系统报了一个异常:“System.InvalidOperationException”类型的异常在 EntityFramework.dll 中发生,但未在用户代码中进行处理
造成这个异常的原因是Movie类中比数据库中多出了一个Rating列,所以我们需要去数据库中添加上Rating字段,你只需要打开数据库文件编辑就行;
现在我们来介绍另外一种方法:使用 Code First 迁移更新数据库
首先,我们需要将App_Data文件夹下的数据库文件(Movies.mdf)删除,然后打开“程序包管理器控制台”(你可以在“工具”菜单下的“NUGet程序包管理器”中找到它),并在控制台中输入 Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext
继续输入命令 add-migration Initial
成功后你会看到解决方案中多了一个Migrations文件夹和Configuration.cs文件,在Configuration类有个Seed方法,在迁移到最新版本之后,将会调用此方法。所以我们需要添加一些初始化的值,否则在执行update-database的时候会失败,就像下图中的那样
在Seed中为数据库表创建一个初始对象
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 }); }
现在再执行update-database就可以成功了,你会看到控制台提说说运行了Seed方法,并且数据库文件也创建好了
在这里你会好奇为啥没看到Rating字段,因为再删除数据库之前的时候我把要增加的属性Rating注释了,如果不注释掉,Rating会被自动添加上的,也就没有我们新增字段这一说了,或者说添加另外一个新的字段Note、Screenwriters...;如果你在执行上面的过程中没有注释掉Rating,为了完成添加新的属性这个任务,你就再创建一个新的属性,而我这里还是用的Rating
现在我们为数据库添加新的列 add-migration Rating,执行完后还需要执行 update-database
查看数据库表结构,我们看到了新增的Rating列
我们添加新的属性可以不用再删除数据库而直接添加了,只需要在控制台执行 add-migration 属性名 和 update-database 指令就行;现在你可以直接运行项目了,它不再会报错。
如果在执行 update-database 过程中一直遇到错误,你可以将Migrations文件夹删除了之后重新开始做上面的操作