EntityFramework在对数据迁移时的支持并不好,现在到了6.3版本以后,Model-First的方法也被抛弃,而Code-First的方法更多的是针对首次建立数据模型的情况。一旦想要修改现有的数据库表结构,对数据库进行迁移(升级)就会遇到各种问题。

在使用EF进行数据迁移时,如果我们修改的不是主键的话,那还是比较简单,增,删减字段,都是可以的,但仍旧需要打开EF的自动合并。

具体方法如下:
(一)在vs的程序包管理控制台中,在默认项目中,选中已经引用EF框架的工程,然后输入enable-migrations –EnableAutomaticMigration:$true
(二)在该项目下会自动生成一个Migration目录,其中会有一个Configuration.cs文件。在这个文件中,默认生成的构造函数中会有两行代码

 AutomaticMigrationsEnabled = true;AutomaticMigrationDataLossAllowed = true;

第一行表示是否允许自动更新,第二行表示在自动更新时是否允许数据的丢失(比如删减了表字段)
(三)接下来其实什么都不用做了,只要你不改主键,其他字段随便怎么改都可以。当然部分改变,比如数据类型的转变,可能需要做一定的逻辑处理,这个可以通过继承自DbContext类,并重载其中的OnModelCreating函数,在函数中使用modelBuilder来实现,还有Conversion类等,这里不详细说明,可以查阅相关资料

如何更新主键

上述方法在遇到需要更改主键时(比如删除原来的主键,新建另一主键),或者更改主键的相关属性时,比如主键是否是自增长ID,也就是使用了EF中对Key的DataAnnotations特性时,当你执行程序,并希望EF完成自动更新时,就会收到一个异常,这个异常有可能时一个NullReferenceException,也有可能是EF通知你有什么Table doesn’t exist。如果去查看抛出异常的InnerException,基本上都是告诉你xxx table doesn’t exist。或是One Table must only one Auto crement Column之类的。

这是因为EF在执行对主键的自动更新时,似乎是会删除原有的表,再新建,并copy原有的数据。EF极有可能是删除原有主键,再新建主键(即时是面对同一字段)。而在这个过程中,关系型数据库的操作因为没有主键,而导致操作失败。

简单的说,EF内部怎么完成这事我们不关心(其实是我没空去看它的源代码)。总之,在执行这个主键更新操作的时候,EF并不是用了一种很聪明,或是很妥善的办法,并不是像我们执行sql语句一样,简单的把主键删除,另外指定,或是更改了其属性。因为EF内部存在一些缓存机制,当EF尝试主键更新时,它用的是最粗暴的推倒重来的方法,那么一旦表失去了主键,当然接下来的操作都失败了

解决的办法如下
(一)在执行过前面的enable指令的前提下,首先关闭AutomaticMigrationsEnabled,将其设为false
(二)在默认项目选定为使用EF的项目下,执行add-migration “xxx”,注意看这时的输出,如果提示你要再次执行,以获得完整的migration,就按提示执行。成功后,会看到migration目录下多出一个文件。xxx就是这个自动产生的文件名的前缀,EF会在前缀后自动添加时间,因此这个前缀可以保持不变,这样以后再有更新,变化的只是前缀后的时间而已
(三)如果你是更新主键,这时可以看到这个文件中生成了两个函数,Up是更新函数,Down是回滚函数。在Up函数中,你可以看到第一行就是DropPrimaryKey,撤销了主键,这就验证了我们前面的猜想。接下来是AlterColumn,修改字段,然后第三句是AddPrimaryKey。照理这三句是EF生成的,执行起来应该没问题吧,但EF就是干了这么傻的事
(四)此时如果你执行Update-Database进行手动更新数据库,那么在第一句DropPrimaryKey执行完后,就会抛出前面提到的异常。因为,将第一,第三句都删除,只保留AlterColumn就可以了

需要注意的是,当使用EF进行主键更新时,不能使用自动更新合并的方式,因为如果AutomaticMigrationsEnabled = true,EF还是会根据你的entity实例的结构尝试更新数据库,此时虽然也是会执行我们通过add-migration生成的更新代码,但在该代码执行前,EF就已经使用entity来更新了,必然报错。所以一定要让AutomaticMigrationsEnabled = false

另外要注意,每次执行这个生成的更新文件,数据库的_migration表里(打开自动更新后,EF自动创建的表)会以该文件名来生成一条记录,因此这个文件你要保存下来。作为下次执行add-migration时生成增量更新代码的依据。如果你删除了这个文件,那么下次的更新文件中会包含已经修改过的内容,这样操作到DB上是会引起问题的。另外就是_migratio表中的记录千万不能删除,如果表中找不到对应的更新文件的记录,EF就是再次执行更新文件对数据库进行更新,显然这也是会有问题的。

总之,使用EF对数据库进行更新的支持并不是很友好,慎用

EntityFrameWork数据迁移——暨改变数据库结构的方法相关推荐

  1. ssh项目同时使用mysql跟sqlserver数据库_MSSQL_如何把sqlserver数据迁移到mysql数据库及需要注意事项,在项目开发中,有时由于项目 - phpStudy...

    如何把sqlserver数据迁移到mysql数据库及需要注意事项 在项目开发中,有时由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Serve ...

  2. mysql 客户无感知迁移_亿级账户数据迁移,不用数据库工具还能怎么搞?

    原标题:亿级账户数据迁移,不用数据库工具还能怎么搞? 背景 在阿里巴巴内部"大中台,小前台"的组织和业务体制,使前线业务更加敏捷,赋能业务积极迎接未来挑战和机遇,在阿里大中台能力建 ...

  3. Django 应用分库,数据迁移成功,数据库没有生成表

    Django 应用分库,数据迁移成功,数据库没有生成表 背景:不同应用对应不同数据库,在迁移数据成功后,数据库没有生成表 Django 官网:https://docs.djangoproject.co ...

  4. mongoose换成mysql_如何将MongoDB数据库的数据迁移到MySQL数据库中

    FAQ v2.0终于上线了,断断续续忙了有2个多月.这个项目是我实践的第一个全栈的项目,从需求(后期有产品经理介入)到架构,再到设计(有征询设计师的意见).构建(前端.后台.数据库.服务器部署),也是 ...

  5. mysql升级后将旧数据迁移到新 数据库中

    mysql升级后将旧数据迁移到新 数据库中 1.将原来数据库进行导出成.sql文件 例:StudentSql.sql 2.进入新数据库的bin目录下 复制bin目录 3.cmd进入bin目录下(需管理 ...

  6. DM 数据迁移工具——DTS(MySQL数据迁移到DM8数据库 Windows环境)

    DM 数据迁移工具--DTS MySQL数据迁移到DM8数据库 Windows环境 DM 数据迁移工具 DM DTS 提供了主流大型数据库迁移到 DM.DM 到 DM.文件迁移到 DM 以及 DM 迁 ...

  7. 一种云平台中基于虚机和订单元信息的跨租户数据迁移实现统一纳管的方法

    一种云平台中基于虚机和订单元信息的跨租户数据迁移实现统一纳管的方法 一.发明名称 一种云平台中基于虚机和订单元信息的跨租户数据迁移实现统一纳管的方法 二.技术领域 云计算 数据迁移 统一纳管 三.现有 ...

  8. 关于亿级账户数据迁移,你应该试试这种方法...

    背景 在阿里巴巴内部"大中台,小前台"的组织和业务体制,使前线业务更加敏捷,赋能业务积极迎接未来挑战和机遇,在阿里大中台能力建设过程中,同质化中台服务将会合并,小前台需要迁移原来依 ...

  9. centos mysql数据迁移_Centos MySQL数据库迁移详细步骤

    其实迁移数据库,一般用sql文件就行,把A服务器数据库的表结构和数据等等导出,然后导入到B服务器数据库, 但是这次数据文件过大,大约有40个G,使用命令行导入,效果不是很好,经常在执行过程中报错.卡死 ...

最新文章

  1. OpenVAS漏洞扫描基础教程之连接OpenVAS服务
  2. 80C51单片机的最小系统
  3. Excel 常见公式
  4. js_jQuery【下拉菜单联动dom操作】
  5. vue.js的一些小语法v-bind,v-if,v-show,v-else
  6. Pytorch基础(三)—— DataSet的应用
  7. 设计模式在项目中的应用案例_设计模式在项目中的应用(初学者版)
  8. restful风格使用小例
  9. 公文写作与计算机应用,德阳市事业单位《计算机应用和公文写作》真题.doc
  10. pyspark编写UDF函数
  11. [转载] java调用c++的dll及java.lang.UnsatisfiedLinkError解决方法
  12. 20191107每日一句
  13. 【2】输入俩个数m,n,字符串st1为1-m组成,输出字符串的倒数第n个字符
  14. 100以内的平方数记忆法
  15. Java文档注释【自制API】
  16. Python总结-学习方向和方法
  17. 给你一个整数数组 nums 。 如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。
  18. 运动无线耳机哪款不容易掉、最不容易脱落的蓝牙耳机推荐
  19. 七牛云融合CDN到底怎么配置?
  20. c语言初学知识点,C语言学习关于数据类型的一些知识点(初学者)

热门文章

  1. 全区开展国家网络安全宣传周活动
  2. Linux玩ps3游戏,手把手教你用PC笔记本畅玩PS3主机游戏教程
  3. 0~n-1缺失的数字(注意尾巴也有可能)
  4. 【视频课程】新能源汽车驱动与三电系统设计高级技术--系列课程
  5. html水平镜像和垂直镜像,css实现镜像翻转的方法有哪些
  6. 大连大学两日游———2021省选联考游记
  7. 储能变流器(PCS),500kW,采用T型三电平模块
  8. 2022-3-25 06.字符串压缩
  9. 每年6月10祭奠歌迷家驹活动
  10. verilog使用注意知识点