工程用的MVC + Entity Framework,根据CodeFirst的编程理念,先创建模型再自动生产数据库和数据表。
看起来这很方便,也给开发带来很多便利,开发时不用考虑数据建库建表。
所以首先建立框架,写好实体和DbContext
当地我们运行程序的时候,程序会根据我们的数据库配置文件生成对应的数据库表和字段
非常方便。
问题来了
一、当我们的程序开发到中途时,发现还需要一个字段。好,按照常理,就在对应的实体加一个属性就是了,但当我们加入实体的时候,再次运行程序就报错了。
有个最笨但简单的方法,删除数据库,再次运行程序。OK,问题接着又来了。
二、当我们的程序试运行一段时间后,需要增加一个字段。怎么办呢?还是按照常理来,在对应的实体加一个属性,OK。接下来我们可能会想到
1、方案一:再次删掉数据库,重新运行程序。可是我们的数据都丢失了,可以发现表是重建了,数据都丢失了。不科学。
2、方案二:直接在数据库对应的表里面加上我们在实体里面命名的属性字段,并且选择对应的数据类型,好,想象中是可以的,而且运行没有报错,但实际会令我们失望。运行程序,程序仍然将我们的表重建,数据丢失。为什么我们手动把数据表字段与实体字段设置成一致了还会出错呢?这个我也没有深究。可能是EF框架另有玄机吧,望有高手指点。
3、方案三:首先备份现有表里面的数据,再删除数据库,运行我们的程序,新的表和字段都建好了,然后我们再想办法不论是写sql插入还是怎么办,反正很麻烦。而且如果遇到有自增主键关联的,你还没办法插对应主键的记录。所以仍不可行。
解决方法:
其实微软早就有很好很完美的解决办法了。通过网上搜集到的资料,简单说明其操作方法
涉及到变更表结构和字段的,都可以用数据迁移的方法。
具体操作如下:
1、首先修改我们的实体。编译通过。
2、打开“程序包管理器控制台”
3、打开之后如下图所示,选中我们的Domain程序集
4、输入“Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext”命令。别急,你得把MvcMovie.Models.MovieDBContext改成你的工程对应正确的类名,如下图
5、命令执行之后,我们会发现我们的程序集里多了一些文件夹和文件。这个是自动生成的。
6、执行命令“add-migration Initial”,其中“Initial”可以自定成其他名字。
7、执行命令“update-database”,成功执行。
8、运行我们的程序,我们会惊奇地发现,我们的表结构已经修改了,而且我们的数据也都还在。
进一步
问题已经解决了,我们再来深入一下这种迁移方式。
一、当我们增加列(增加实体字段)时,可以不必重复上面的所有操作。
1、只需要将\Migrations\Configuration.cs文件中的AutomaticMigrationsEnabled = false;改成true
2、然后程序包管理器控制台执行“update-database”,成功后,在启动运行程序,我们就完成删除列的操作了,很简单吧。
二、当我们删除列(删除实体字段)时,同样使用上面的操作,没有成功,报会丢失数据,所以不能简单地执行“update-database”就能完成。
1、执行命令“add-migration Initial”。
2、执行命令“update database”。
3、运行程序,更新完毕。
三、这些都是简单的增删操作,利用这种方式能进行很多修改结构的操作而不影响数据。但有些操作利用这种方法仍然不能实现,比如说修改数据的类型,如从字符串改成数值类型等。根据实际情况用不同的方式方法来解决。