在运行正常的情况下,EF的数据迁移功能非常强大。但是当它出现状况时,试图找到问题发生的原因时通常都很让人郁闷(没法调试,提示信息很模糊等等原因)。我花了很多时间来确保在我的迁移能工作正常,然后我整理了一些经验给大家分享一下:

  1. 不要使用自动迁移(Automatic Migrations)

    自动迁移很适合演示环境或者快速验证模型等,但是在生产环境中就不太适合了。以下是不是用自动迁移的一些原因:

    1. 自动迁移不能产生唯一标示,所以两次迁移过程中不能产生差异化脚本,也就不能应用于其他环境,尤其是生产环境需要使用脚本进行迁移的时候。
    2. 自动迁移不会显示数据库发生了什么更改,也不提供单独的备份方法。
    3. 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.

    下面是如何关闭自动迁移的方法:

  2. 了解_MigrationHistory 表(启用迁移后在数据库中自动生成的迁移历史记录表)

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

  3. 迁移并不是只能“升”,它也能“降”

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

  4. 如果你想重新生成迁移计划(“re-scaffold”),确保先撤销迁移。

    ‘Re-scaffolding’将会重新产生现有迁移的内容并添加一些新的改动进去。

    如果迁移已经应用到数据库,那必须先撤销迁移,然后再重新生成迁移文件。(使用update-database -target:xxxMigrationName)。如果没有撤销,迁移文件将会被修改,下次数据库迁移就会出现问题(可能就没法回退了)

  5. 绝对不要再撤销迁移之前,删除迁移文件。

    首先迁移是可以回退版本的,如果在撤销迁移之前删除迁移文件,数据库将陷入无效状态。如果在后续继续添加迁移文件,可能会产生迁移问题(比如,新的迁移文件包含上一次迁移到内容,执行update-databse时会提示,更改已经存在)

  6. 了解数据表关联处理(包括Fluent API)

    下面的代码很难理解么?

    对我来说是的。无论如何配置数据表之间关系的时候一定要了解Fluent API的相关知识,可以在下文学习 configure the correct relationship

  7. 查看迁移代码

    为什么?难道是生成的迁移代码有问题么?其实并不是。我在每次生成都要以后检查一下迁移文件,大多时候只是确保是关系配置的是否正确或者有没有遗漏了什么。

  8. 彻底恢复到初始状态,然后再回来

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

  9. 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的一些小提示的更多相关文章

  1. MVC5中Model层开发数据注解 EF Code First Migrations数据库迁移 C# 常用对象的的修饰符 C# 静态构造函数 MSSQL2005数据库自动备份问题(到同一个局域网上的另一台电脑上) MVC 的HTTP请求

    MVC5中Model层开发数据注解   ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证( ...

  2. EF 中 Code First 的数据迁移以及创建视图

    写在前面: EF 中 Code First 的数据迁移网上有很多资料,我这份并没什么特别.Code First 创建视图网上也有很多资料,但好像很麻烦,而且亲测好像是无效的方法(可能是我太笨,没搞成功 ...

  3. EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  4. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  5. 2.EF中 Code-First 方式的数据库迁移

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...

  6. 在Code First中使用Migrations对实体类和数据库做出变更

    在Code First中使用Migrations对实体类和数据库做出变更,Mirgration包含一系列命令. 工具--库程序包管理器--程序包管理器控制台 运行命令:Enable-Migration ...

  7. Django中的ORM框架使用小技巧

      Django中的ORM框架使用小技巧 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. Django对各个数据提供了很好的支持,包括PostgreSQL,MySQL,SQLite ...

  8. 在EF中执行SQL语句(转载)

    在EF中执行SQL语句   你可能要问,我用EF不就为了避免写SQL吗?如果要写SQL我不如直接用ADO.NET得了.话虽然这么说没错,可有些时候使用EF操作数据还是有一些不方便,例如让你根据条件删除 ...

  9. C# EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

随机推荐

  1. fusioncharts Y轴不显示中文的解决方法(转载)

    使用fusionChart主要是被其界面吸引了,各类图表都很好看,下载以后文档也很周全,支持的语言也很多种 ,容易上手.fusionChart工作原理主要是通过后台传xml数据源给报表前台flash ...

  2. javascript中Date使用

    <script type="text/javascript">    //返回当前日期和时间        var newDate=new Date();        ...

  3. windows下 Memcache cpu占用过高

    分析应该是memcache的内存大小还是默认配置,已经满足不了当前的大数据量的需要了,大量的新缓存需要进入,同时大量的旧缓存又需要被淘汰出来,一进一出导致CPU占用过多. 进入注册表,找到:HKEY_ ...

  4. iOS.NSString.pitfall-in-using-nsstring

    1. NSString的使用 在CodeReview中, 发现类似以下代码, 表示深深受伤了: NSString* fString = [NSString stringWithFormat:@&quo ...

  5. 解决 Ubuntu 下 sudo 命令执行速度慢的问题

    1.首先如果当用登录的用户名不在"/etc/sudoers"文件中,是不能执行sudo命令的.可以用root身份手动修该文件,把当前登录用户名加入该文件中. 2.用"ho ...

  6. 另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新

    目的:vue-cli构建的vue单页面应用,某些特定的页面,实现前进刷新,后退不刷新,类似app般的用户体验.注: 此处的刷新特指当进入此页面时,触发ajax请求,向服务器获取数据.不刷新特指当进入此 ...

  7. 深入浅出 JMS(二) - ActiveMQ 入门指南

    深入浅出 JMS(二) - ActiveMQ 入门指南 上篇博文深入浅出 JMS(一) – JMS 基本概念,我们介绍了消息通信的规范JMS,这篇博文介绍一款开源的 JMS 具体实现-- Active ...

  8. 记unit of work与事务提交

    https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using- ...

  9. SQLInjection 靶场配置

    对于渗透,太小型的网站没有太大价值,而大型网站(比如各种电商平台)对于代码审计往往非常严格,新手基本找不到漏洞,而一些比较容易搞掉的站点(政府.gov.各种教育网站.edu或者很多商业中型站点)渗透又 ...

  10. json、JSONObject、JSONArray的应用

    type.java package jiekou.duixiang; import java.text.ParseException;import java.text.SimpleDateFormat ...