关于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 ...
随机推荐
- sqlserver 几种datatime的区别
参考文章1 smalldatetime 占4位精确到分钟.时间从1900.1.1到2079.6.6datetime占8位精确到毫秒.时间从1753.1.1到9999.12.31 参考文章2 datet ...
- Spring框架管理开源的连接池
1. 管理DBCP连接池 * 先引入DBCP的2个jar包 * com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar * com.spring ...
- Ruby环境配置
一.rvm 1.简介 rvm是一个命令行工具,可以提供一个便捷的多版本ruby环境的管理和切换. 2.安装步骤 1.新建文件:rvm-installer.sh vi rvm-installer.sh ...
- Problem B. Market(market.c/cpp/pas)
Problem B. Market(market.c/cpp/pas)Time limit: 1 secondsMemory limit: 128 megabytes在比特镇一共有 n 家商店,编号依 ...
- Java 8 可重复注解与类型注解
Java 8 可重复注解与类型注解 Java 8 对注解处理提供了两点改进:可重复的注解及可用于类型的注解. // 首先要提供一个容器,MyAnnotation 才能用于可重复注解 @Target({ ...
- 新电脑的操作系统win10的所有设置问题汇总
上来改的win7发现很多驱动没法装,装了也不能用,后来只能改win10了,另外win7的风扇声音也很大. 1.关闭win10自动更新.在服务里面禁用winupdate 2.注销改成了点头像,然后点注销 ...
- Spring Boot 简单的请求示例(包括请求体验证)
1.先做个最简单的Get请求 新建一个Controller , 并给他添加注解@RestController 它是@Controller和@ResponseBody的组合注解,告诉Spring我是一个 ...
- 实体类在set字段时报空指针异常
实体类在set字段时报空指针异常的原因: T_Entry entry=null;entry.setGeneName("1212");entry.setEntryName(" ...
- 2018.10.15 loj#6010. 「网络流 24 题」数字梯形(费用流)
传送门 费用流经典题. 按照题目要求建边. 为了方便我将所有格子拆点,三种情况下容量分别为111,infinfinf,infinfinf,费用都为validi,jval_{id_{i,j}}valid ...
- Django-组件
https://www.cnblogs.com/yuanchenqi/articles/8034442.html