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. SQL Server 中,实现 varbinary 与 varchar 类型之间的数据转换
  2. mysql5.6错误代码
  3. 万字好文 | 数字化转型之道——数据治理体系能力提升
  4. (计算机组成原理)第六章总线-第二节:总线仲裁(链式查询,计数器查询、独立请求)
  5. 基于Linux内核红黑树的TR069参数解析工具:树形结构+CPE RPC支持
  6. 海外仓储系统有哪些功能?
  7. Java程序员必经的实践之路:微服务与SOA架构
  8. 常见并发工具的使用和原理解析——Condition(重点在第五节)
  9. matlab男女声识别,matlab男女声音识别
  10. CodeBlocks汉化安装教程
  11. Markdown编辑器——Editor.md的使用
  12. 景点接口 查询携程旅游门票景点详情
  13. switchport mode access
  14. 【转】贾佳亚港中文团队冠军技术分享:最有效的COCO物体分割算法
  15. linux开启rdp服务,让windows电脑mstsc远程,linux rdesktop远程windows机器
  16. EMNLP 2021中预训练模型最新研究进展
  17. 行人重识别(ReID)概述
  18. 蚂蚁矿池宣布赞助火箭队,吴忌寒这回要把 BCH 印在 NBA 球衣上吗?
  19. oracle sysdate取年月日,oracle获取当前年月日时分秒季度周
  20. 论文-Geography-Aware Sequential Location Recommendation

热门文章

  1. SMPTE 274M 协议详细解读
  2. 你知道吗?优秀的代码都是这样分层的!
  3. PCBA加工虚焊和假焊的原因及解决方法
  4. 超Easy正则表达式实战教程---入门 :匹配多种形式浮点数
  5. c语言 cgi php,C语言CGI编程入门(一)
  6. SLAM:即时定位与地图构建的入门指南
  7. 大学英语计算机四级考试内容,大学英语四级机考备考方法
  8. 整数边界对齐方式_c中结构体边界对齐(转)
  9. mysql错误连接次数过多_解决Mysql连接过多错误的方法
  10. mysql 5.7开发者安装_MySQL 5.7 yum 安装、授权