在开发数据库应用程序的时候,经常会遇到某些表需要添加字段或者修改类型、新增表等需求,而对于EF Code First来说关注的只有实体类,当需求变更时只需要添加新的实体类或者在实体类中添加、删除、修改属性即可。但是修改完成之后要如何将修改同步到数据库中?

  Entity Framework提供了Migrations机制来解决这一问题。

启用Migrations

  在VS中的Package Manager Console窗口中选择默认项目为DbContext存在的项目,并执行命令:
  enable-migrations

  

  然后项目中将生成Migrations目录和Configuration类型:

  

  

  构造方法:用于对一些Migrations相关的配置,如上代码就是禁用了自动迁移。
  Seed方法:根据注释可知在迁移后执行,一般用来添加默认数据。Configuration类型可以根据需求进行修改。

  注:如过出现以下错误,可把命名空间删除修复:

  

通过Add-Migration添加Migration

  如果已经存在数据库那么需要使用–IgnoreChanges参数来创建一个空的Migration来对应当前的数据库模型:
  Add-Migration InitialCreate –IgnoreChanges

  

  这时在Migrations目录下会生成一个带时间戳的InitialCreate.cs文件:

  

  注:上面的代码的Up和Down方法之所以为空是因为使用了–IgnoreChanges参数,因为数据库中已经有对应的表和字段,所以不应该再创建一次,如果去掉该参数会生成以下代码:

  

Update-Database更新数据库

  执行Update-Database目录来更新数据库:
  update-database -StartUpProjectName 'My Blog' -ProjectName BlogRepository.MySQL
  注:由于本例的DbContext相关类型在BlogRepository.MySQL中,但是连接字符串在My Blog项目中,所以在执行数据库更新时需要指定启动项目和项目名称两个参数。一般情况下使用update-database命令即可。

  

  这时数据库中多了一个名称为__MigrationsHistory表并有一条记录。

  

更新模型并添加新的Migration

  1. 为模型添加一个新的属性"IsPublish"来代表文章是否被公开:

   

  2. 运行Add-Migration命令,名称最好与变更相关用于区分多个Migration便于维护:
  add-migration addIsPublishColumn

  

  执行命令后会生成一个DbMigration的子类,该类型中包含一个Up和Down方法,分别对应更新时和回退时对数据库的操作:

  

  上面的Up方法就是为dbo.Posts表添加名为"IsPublish"的列,如果回滚这个Migration时则把该列删除。

  3. 再次使用update-database命令将新的变更同步到数据库中:

  update-database -StartUpProjectName 'My Blog' -ProjectName BlogRepository.MySQL -Verbose

  

  注:使用参数-Verbose可以看到更多执行信息,包括执行的SQL语句。

启动应用时自动将数据库更新至最新

  启动应用时将数据库更新至最新可以省略“update-database”命令执行这一过程,只需要添加了Migration,并且该Migration没有同步到数据库,那么在应用执行(实际上是DbContext在创建模型时OnModelCreating)将会把修改同步到数据库。

  1. 添加ClickCount属性:

  

  2. 在DBContext类型中添加OnModelCreating方法及代码(注:该操作也可以通过配置文件配置):

  

  3. 运行程序:

  

  4. 查看结果:

  

关于Automatic Migrations(自动迁移)

  自动迁移指的是在执行“update-database”命令时,将对比实体模型与数据库结构,如果它们有差异则以实体模型为准,将差异同步到数据库。相当于省略了add-migration命令。

  在执行启动迁移命令(enable-migrations )时,可以添加参数–EnableAutomaticMigrations或者在生成待Configuration类型的构造方法中将AutomaticMigrationsEnabled的值设为true。

  

  自动更新数据库(migrate database to latest version)与自动迁移(automatic migrations),前者省略“update-database”后者省略“add-migration”,如果一起使用则两者都省略,开发者仅需通过enable-migrations命令开启迁移,然后在开发中修改完成实体类,就可以调试程序,调试程序过程中自动更新数据库结构。

  

小结:
  本章主要是介绍EF的迁移功能,对于EF来说这是一个非常重要的功能,因为在开发过程中特别是code first开发过程中,经常会添加实体、修改实体属性甚至会在使用Fluent API来映射数据库关系的时候也会针对某些属性进行修改,如字段类型、最大长度以及索引等。

  对于自动更新数据库以及自动迁移功能,个人不建议在团队开发正式项目时使用,因为使用Add-Migration命令可以很好的追踪数据库结构的更新,并且可以根据情况进行回滚。而自动更新数据库会导致数据库结构改变,团队工作中如果多人使用了同一个数据库并且在代码未同步时会导致错误的出现。
  但启用自动迁移并且设置数据库初始化时自动将数据库更新至最新将节省很多操作。各有利弊可根据情况选择。

参考:

  https://msdn.microsoft.com/en-us/library/jj591621(v=vs.113).aspx

本文连接:http://www.cnblogs.com/selimsong/p/7656648.html

ASP.NET没有魔法——目录

ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations的更多相关文章

  1. ASP.NET开发实战——(十二)ASP.NET MVC 与数据库之Entity Framework Migrations

    在开发数据库应用程序的时候,经常会遇到某些表需要添加字段或者修改类型.新增表等需求,而对于EF Code First来说关注的只有实体类,当需求变更时只需要添加新的实体类或者在实体类中添加.删除.修改 ...

  2. ASP.NET没有魔法——ASP.NET MVC 与数据库大集合

    ASP.NET没有魔法——ASP.NET与数据库 ASP.NET没有魔法——ASP.NET MVC 与数据库之MySQL ASP.NET没有魔法——ASP.NET MVC 与数据库之ORM ASP.N ...

  3. ASP.NET没有魔法——ASP.NET MVC 与数据库之ORM

    什么是ORM 对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转 ...

  4. ASP.NET没有魔法——ASP.NET MVC IoC

    之前的文章介绍了MVC如何通过ControllerFactory及ControllerActivator创建Controller,而Controller又是如何通过ControllerBase这个模板 ...

  5. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  6. ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证

    随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...

  7. ASP.NET没有魔法——ASP.NET MVC 路由的匹配与处理

    ASP.NET MVC的路由是MVC应用的一个核心也是MVC应用处理的入口,作为一个开发者,在正常情况下仅仅需要做的就是根据需求去定义实体.业务逻辑,然后在MVC的Controller中去调用.Vie ...

  8. ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(下篇)

    上一篇<ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)>文章介绍了ASP.NET MVC模型绑定的相关组件和概念,本章将介绍Controller在执行时是如何通过这 ...

  9. ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

    对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的界面呈现工作是由浏览器完成的,Web应用的原理是通过Http协议从服务器上获取到 ...

随机推荐

  1. 第3阶段——内核启动分析之make uImage编译内核(3)

    目标: 通过分析makefile,明白make uImage如何编译内核 把整个内核的makefile分成三类(makefile资料文档在linux-2.6.22.6/Documentation/bu ...

  2. ln命令详解

    ln命令 (全称:link) ln命令用来为文件创建一个连接,类似于Windows的快捷方式,连接类型分为硬连接和软连接(符号连接)两种,默认的连接类型是硬连接.如果要创建符号连接必须使用" ...

  3. SEO搜索引擎优化(一)

    什么是SEO呢 英文为"Search Engine Optimization",中文名为"搜索引擎优化".SEO是指通过对网站进行站内优化和修复(网站Web结构 ...

  4. PHP初入,简易网页整理(布局&特效的使用)

    html><html> <head> <meta charset="UTF-8"> <title></title> ...

  5. Unity2017.x 版本的下载安装

    Unity2017 版本从2017年7月开始正式发布Unity2017.1版本,为了初学者更加清晰明了的掌握全过程,笔者还是以完整的共19个步骤来给大家演示下载与配置安装的全过程,方便广大读者的无障碍 ...

  6. Mac Intellij Debug 模式

    前言:本文的核心是记录debug的使用,与具体的操作系统无关. 1.什么是Debug Debug是程序的一种运行模式.用来发掘程序的走向,以及程序在运行过程中参数的变化. 2.Debug的作用 deb ...

  7. 个人作业(3)----个人总结(Alpha阶段)

    一.个人总结. 个人完成的任务:在此阶段我完成了用户调研.部分测试以及部分博客书写. 个人及团队心得:经过几周Alpha阶段开发后,我大致了解了开发软件的过程,开发一个软件并没有以往想象中那么简易,在 ...

  8. 201521123005 《java程序设计》 第七周学习总结

    1. 本周学习总结 参考资料: XMind 2. 书面作业 Q1ArrayList代码分析 1.1 解释ArrayList的contains源代码 ArrayList的contains源代码 /** ...

  9. 201521123062《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中fin ...

  10. 201521123075 《Java程序设计》第12周学习总结

    1. 本周学习总结 2. 书面作业 将Student对象(属性:int id, String name,int age,double grade)写入文件student.data.从文件读出显示. 1 ...