关于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 ...
随机推荐
- apache中开启rewrite
1.在apache配置文件httpd.conf中找到如下行: #LoadModule rewrite_module modules/mod_rewrite.so 去掉该行前面的#号 2.在httpd. ...
- centos6.6中修改yum源
1.进入设置yum源的目录 > cd /etc/yum.repos.d 2.复制或重命名CentOS-Base.repo文件 > mv CentOS-Base.repo CentOS-Ba ...
- Spring框架的AOP技术之通知类型
1. 通知类型 * @Before -- 前置通知 * @AfterReturing -- 后置通知 * @Around -- 环绕通知(目标对象方法默认不执行的,需要手动执行) * @After - ...
- Apache模块开发
一.简介 Apache HTTP服务器是一个模块化的软件,使管理者可以选择核心中包含的模块以裁剪功能.可以在编译时选择被静态包含进httpd二进制映象的模块,也可以编译成独立于主httpd二进制映象的 ...
- POJ3687.Labeling Balls 拓扑排序
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13201 Accepted: 3811 Descr ...
- 第十届Mockplus ▪ UXPA用户体验西南赛区决赛成功举行
九月的重庆,秋意渐浓. 伴随着凉爽的秋风,第十届Mockplus·UXPA国际用户体验创新大赛(UXD Award2018)西南赛区决赛于9月16日下午在四川美术学院-虎溪校区成功举办.来自西南区域各 ...
- 任务取消TASK
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 给Array添加去重原型方法
Array.prototype.unique = function(){ var newArray = []; var oldArray = this; if(oldArray.length<= ...
- Metro Revealed: Building Windows 8 apps with XAML and C# 阅读笔记
第一章1.1.3中提到 Jesse Liberty 的<Pro Windows 8 Development with XAML and C#>,这是一本关于win8更全面的书,以后看.
- 使用WebUploader客户端批量上传图片,后台使用springMVC接收实例
使用WebUploader客户端批量上传图片,后台使用springMVC接收实例 我是搞Java后台的,因为最近主管让用webUploader写客户端,但是在网上找了很多,能够复制就能用的并没有几个, ...