开发者社区> 小新的蜡笔> 正文

CodeFirst解决数据迁移问题

简介: 版权声明:欢迎评论和转载,转载请注明来源。 https://blog.csdn.net/zy332719794/article/details/8845405         工程用的MVC + Entity Framework,根据CodeFirst的编程理念,先创建模型再自动生产数据库和数据表。
+关注继续查看
版权声明:欢迎评论和转载,转载请注明来源。 https://blog.csdn.net/zy332719794/article/details/8845405

        工程用的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、运行程序,更新完毕。

三、这些都是简单的增删操作,利用这种方式能进行很多修改结构的操作而不影响数据。但有些操作利用这种方法仍然不能实现,比如说修改数据的类型,如从字符串改成数值类型等。根据实际情况用不同的方式方法来解决。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
用EIP直通车解决迁移到VPC后服务器内无公网IP的过程
背景: 经典迁移VPC对于目前的阿里云来说 是解决一个重大的历史遗留问题。在上古时期,公有云的租户不多,因为可以给每个实例分配一个EIP一个内网IP。隔离租户只用了安全组来实现,因此其实留下了蛮多问题的。
2234 0
API浏览器数据查询失败问题的解决
由于API浏览器是针对VB而开发的,所以数据库采用的DAO,但是随着API浏览器的升级,不仅支持VB本身,也提供VB.net,C#API的查询,甚而是一些E文不太好的朋友,在开发VC程序时,也看一下API的中文说明。
470 0
+关注
小新的蜡笔
专业从事地理信息系统(GIS)技术工作7~8年。具有丰富的GIS架构、地图展示方面的经验。喜欢探索以及与小伙伴们探讨、分享技术。
134
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载