关于EF中使用Migrations的一些小提示
在运行正常的情况下,EF的数据迁移功能非常强大。但是当它出现状况时,试图找到问题发生的原因时通常都很让人郁闷(没法调试,提示信息很模糊等等原因)。我花了很多时间来确保在我的迁移能工作正常,然后我整理了一些经验给大家分享一下:
不要使用自动迁移(Automatic Migrations)
自动迁移很适合演示环境或者快速验证模型等,但是在生产环境中就不太适合了。以下是不是用自动迁移的一些原因:
- 自动迁移不能产生唯一标示,所以两次迁移过程中不能产生差异化脚本,也就不能应用于其他环境,尤其是生产环境需要使用脚本进行迁移的时候。
- 自动迁移不会显示数据库发生了什么更改,也不提供单独的备份方法。
- Automatic Migrations are applied using the same ‘Update-Database’ command that also runs the Code-Based migrations (side effect free!). When mixing Automatic and Code-based migrations a simple ‘Update-Database’ to run Code-based migrations may also generate Automatic ‘ghost’ scripts against the database.
下面是如何关闭自动迁移的方法:

了解_MigrationHistory 表(启用迁移后在数据库中自动生成的迁移历史记录表)
_MigrationHistory表提供了有关数据库的元数据,最重要的是它显示了那些迁移已经应用。在某些时候需要手动从这里删除记录,默认情况下它是一个系统表,但可以进行其他配置

迁移并不是只能“升”,它也能“降”
每一个迁移都有相应的升级或者降级的概念,当升级的时候,数据库将会应用迁移,当降级的时候,目标数据库会撤销相应的迁移。了解降级时目标数据库中结构和数据发生了什么和升级一样重要,保险起见,应该把它作为一项应急计划,确保发生问题可以轻松处理。

如果你想重新生成迁移计划(“re-scaffold”),确保先撤销迁移。
‘Re-scaffolding’将会重新产生现有迁移的内容并添加一些新的改动进去。
如果迁移已经应用到数据库,那必须先撤销迁移,然后再重新生成迁移文件。(使用update-database -target:xxxMigrationName)。如果没有撤销,迁移文件将会被修改,下次数据库迁移就会出现问题(可能就没法回退了)
绝对不要再撤销迁移之前,删除迁移文件。
首先迁移是可以回退版本的,如果在撤销迁移之前删除迁移文件,数据库将陷入无效状态。如果在后续继续添加迁移文件,可能会产生迁移问题(比如,新的迁移文件包含上一次迁移到内容,执行update-databse时会提示,更改已经存在)
了解数据表关联处理(包括Fluent API)
下面的代码很难理解么?
对我来说是的。无论如何配置数据表之间关系的时候一定要了解Fluent API的相关知识,可以在下文学习 configure the correct relationship
查看迁移代码
为什么?难道是生成的迁移代码有问题么?其实并不是。我在每次生成都要以后检查一下迁移文件,大多时候只是确保是关系配置的是否正确或者有没有遗漏了什么。

彻底恢复到初始状态,然后再回来
经常检查一下迁移文件与数据库是否匹配,它们是否健康。一个方法是撤销所有迁移使其回到数据库的初始状态,然后再使用“Update-database”回到现在。比较适合使用单元测试自动完成。

Relax
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/
关于EF中使用Migrations的一些小提示的更多相关文章
- MVC5中Model层开发数据注解 EF Code First Migrations数据库迁移 C# 常用对象的的修饰符 C# 静态构造函数 MSSQL2005数据库自动备份问题(到同一个局域网上的另一台电脑上) MVC 的HTTP请求
MVC5中Model层开发数据注解 ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证( ...
- EF 中 Code First 的数据迁移以及创建视图
写在前面: EF 中 Code First 的数据迁移网上有很多资料,我这份并没什么特别.Code First 创建视图网上也有很多资料,但好像很麻烦,而且亲测好像是无效的方法(可能是我太笨,没搞成功 ...
- EF Code First Migrations数据库迁移
1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
- 2.EF中 Code-First 方式的数据库迁移
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...
- 在Code First中使用Migrations对实体类和数据库做出变更
在Code First中使用Migrations对实体类和数据库做出变更,Mirgration包含一系列命令. 工具--库程序包管理器--程序包管理器控制台 运行命令:Enable-Migration ...
- Django中的ORM框架使用小技巧
Django中的ORM框架使用小技巧 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Django对各个数据提供了很好的支持,包括PostgreSQL,MySQL,SQLite ...
- 在EF中执行SQL语句(转载)
在EF中执行SQL语句 你可能要问,我用EF不就为了避免写SQL吗?如果要写SQL我不如直接用ADO.NET得了.话虽然这么说没错,可有些时候使用EF操作数据还是有一些不方便,例如让你根据条件删除 ...
- C# EF Code First Migrations数据库迁移
1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...
随机推荐
- [leetcode]257. Binary Tree Paths二叉树路径
Given a binary tree, return all root-to-leaf paths. Note: A leaf is a node with no children. Example ...
- linux下的xampp安装
最近因为要部署一个php的公众号应用到一台linux的测试服务器,在考虑是用xampp这样的集成环境还是自己配置.故两个都安装配置下. 最后经过研究查阅相关资料后,总结: 因为xampp本身很开放,几 ...
- 201621123008 《Java程序设计》第六周实验总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 2. 书面作业 1. clone方法 1.1 在 ...
- 如何从dvi生成pdf--------亲测有效果.
用里面第二个命令. http://blog.csdn.net/u014682350/article/details/46482477
- C++ 面向对象基本释义
public:子类继承,子类亦可以访问.本类函数可以访问,本类对象可以访问. private:子类继承,子类不可访问.本类(所有)函数以及友员函数可以访问,本类对象不可以访问. protect:子类继 ...
- yum 报错:centos yum (28, 'Connection time-out') Trying other mirror.
前言: 在使用yum安装 软件时,经常出现 centos yum (28, 'Connection time-out') Trying other mirror. 或下面的那样情况imeout on ...
- linux安装mysql~~~mysql5.6.12
Linux安装mysql服务器 准备: MySQL-client-5.6.12-1.rhel5.i386.rpm MySQL-server-5.6.12-1.rhel5.i386.rpm 首先检查环境 ...
- HDU 1009 FatMouse' Trade (贪心算法)
题意:就是老鼠要用猫粮换粮食,第i个房间一些东西,要用东西去换,可以不全换.问给定的猫粮最多能换多少粮食. 析:贪心算法.我们先算出来每个房间物品的平均价格是多少,肯定越低越好,并且如果能全换就全换, ...
- 测试-LoadRunner
1录脚本 设置解析方式,html形式,会精炼成一个函数,此时找有用的url,写出函数:url方式,函数比较多. 参数化 两参数成对时,在脚本处选成对. 加上进程,加上返回值判断. 最后一段接口url, ...
- React 组件的生命周期API和事件处理
一.简单记录React的组件的简洁的生命周期API: A:实例化期: 一个实例第一次被创建时所调用的API与其它后续实例被创建时所调用的API略有不同. 实例第一次被创建时会调用getDefaultP ...