在运行正常的状况下,EF的数据迁移功能很是强大。可是当它出现情况时,试图找到问题发生的缘由时一般都很让人郁闷(无法调试,提示信息很模糊等等缘由)。我花了不少时间来确保在个人迁移能工做正常,而后我整理了一些经验给你们分享一下: 数据库
自动迁移很适合演示环境或者快速验证模型等,可是在生产环境中就不太适合了。如下是否是用自动迁移的一些缘由: app
下面是如何关闭自动迁移的方法: ide
_MigrationHistory表提供了有关数据库的元数据,最重要的是它显示了那些迁移已经应用。在某些时候须要手动从这里删除记录,默认状况下它是一个系统表,但能够进行其余配置 单元测试
每个迁移都有相应的升级或者降级的概念,当升级的时候,数据库将会应用迁移,当降级的时候,目标数据库会撤销相应的迁移。了解降级时目标数据库中结构和数据发生了什么和升级同样重要,保险起见,应该把它做为一项应急计划,确保发生问题能够轻松处理。 学习
‘Re-scaffolding’将会从新产生现有迁移的内容并添加一些新的改动进去。 测试
若是迁移已经应用到数据库,那必须先撤销迁移,而后再从新生成迁移文件。(使用update-database -target:xxxMigrationName)。若是没有撤销,迁移文件将会被修改,下次数据库迁移就会出现问题(可能就无法回退了) 调试
首先迁移是能够回退版本的,若是在撤销迁移以前删除迁移文件,数据库将陷入无效状态。若是在后续继续添加迁移文件,可能会产生迁移问题(好比,新的迁移文件包含上一次迁移到内容,执行update-databse时会提示,更改已经存在) code
下面的代码很难理解么? blog
对我来讲是的。不管如何配置数据表之间关系的时候必定要了解Fluent API的相关知识,能够在下文学习 configure the correct relationship ip
为何?难道是生成的迁移代码有问题么?其实并非。我在每次生成都要之后检查一下迁移文件,大多时候只是确保是关系配置的是否正确或者有没有遗漏了什么。
常常检查一下迁移文件与数据库是否匹配,它们是否健康。一个方法是撤销全部迁移使其回到数据库的初始状态,而后再使用“Update-database”回到如今。比较适合使用单元测试自动完成。
Learning Migrations can be a frustrating time suck. Don’t punch your monitor. Instead take a breather and relax, then come back to it. It is an investment, but when mastered it will pay dividends to your team and process.
参考文档:https://elegantcode.com/2012/04/12/entity-framework-migrations-tips/