关于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 ...
随机推荐
- 【校招面试 之 剑指offer】第10-1题 斐波那契数列
递归以及非递归实现: #include<iostream> using namespace std; long long fun(long long n){ if(n == 0){ ret ...
- jQuery html5Validate基于HTML5表单验证插件
更新于2016-02-25 前面提到的新版目前线上已经可以访问: http://mp.gtimg.cn/old_mp/assets/js/common/ui/Validate.js demo体验狠狠地 ...
- php使用数组语法访问对象
有一个对象,不过希望能用数组的语法来读写数据,可以使用 实现SPL的ArrayAccess接口来解决. 使用场景:加载配置文件类.larvel框架加载配置文件就这利用数组来操作对象. 数组式访问Obj ...
- 使用System.Net.Mail发送邮件
引用命名空间: using System.Net.Mail; /// <summary> /// 发送HTML邮件,有抄送和密送 /// 需要在Web.config文件中的system.n ...
- 解决ios手机页面overflow scroll滑动很卡的问题
在移动端html中经常出现横向/纵向滚动的效果,但是在iPhone中滚动速度很慢,感觉不流畅,有种卡卡的感觉,但是在安卓设备上没有这种感觉; 要解决这个问题很简单: 一行代码搞定 -webkit-ov ...
- PAT 1020 月饼 (25)(精简版代码+思路+推荐测试用例)
1020 月饼 (25)(25 分)提问 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是 ...
- VMware workstation 设定开机引导等待时间
找到虚拟机磁盘文件所在的目录,编辑里面的扩展名为vmx文件,记事本即可操作,在末尾加入如下一行: bios.bootDelay = "20000" 这里的数字是毫秒,上面例子中的数 ...
- Jquery Mobile 随记
1. 设置全局的页面过渡效果 $.mobile.defaultDialogTransition='none';
- 设置powershell ExecutionPolicy
Get-ExecutionPolicy -List Set-ExecutionPolicy -Scope CurrentUser AllSigned Policies: Restricted/AllS ...
- python list和函数之间的复制和原地址修改问题
def change(a): a.pop() #自带的方法都是原地址修改 a=[,,] change(a) print (a)#直接修改了3. def change(a): a=[,,,] #复制操作 ...