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

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

  本文要点:

  ●启用Migrations
  ●通过Add-Migration添加Migration
  ●Update-Database更新数据库
  ●更新模型并添加新的Migration
  ●启动应用时自动将数据库更新至最新版本
  ●关于Automatic 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命令可以很好的追踪数据库结构的更新,并且可以根据情况进行回滚。而自动更新数据库会导致数据库结构改变,团队工作中如果多人使用了同一个数据库并且在代码未同步时会导致错误的出现。
  但启用自动迁移并且设置数据库初始化时自动将数据库更新至最新将节省很多操作。各有利弊可根据情况选择。

欢迎添加个人微信号:Like若所思。

欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!

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

    本文主要内容是通过分析<博客系统>需求,确定使用Web应用的形式来开发,然后介绍了HTML.HTTP的概念,并使用IIS搭建了一个静态的HTML“页面”,从而引出“动态”的ASP.NET. ...

  3. WCF开发实战系列二:使用IIS发布WCF服务

    WCF开发实战系列二:使用IIS发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们使用VS200 ...

  4. List多个字段标识过滤 IIS发布.net core mvc web站点 ASP.NET Core 实战:构建带有版本控制的 API 接口 ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac

    List多个字段标识过滤 class Program{  public static void Main(string[] args) { List<T> list = new List& ...

  5. [原创].NET 分布式架构开发实战之二 草稿设计

    原文:[原创].NET 分布式架构开发实战之二 草稿设计 .NET 分布式架构开发实战之二 草稿设计 前言:本篇之所以称为草稿设计,是因为设计的都是在纸上完成的.反映了一个思考的过程. 本篇的议题如下 ...

  6. OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa

    元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...

  7. ASP.NET开发实战——(十)ASP.NET MVC 与数据库之MySQL&EF

    之前介绍EF时介绍了provider这个配置项,而且也介绍了在ASP.NET访问MySQL数据仍然是通过ADO.NET,不同的地方仅仅是更换了MySQL的数据提供器,那么在EF中是否也只需更换“提供器 ...

  8. ASP.NET开发实战——(九)ASP.NET MVC 与数据库之ORM

    之前的文章中介绍了如何在ASP.NET中通过ADO.NET操作SQL Server和My SQL数据库,数据库的操作是通过SQL语句的执行来完成的,在ASP.NET中还有一个简便的方式来使用数据库,那 ...

  9. ASP.NET开发实战——(五)ASP.NET MVC & 分层

    上一篇文章简要说明了MVC所代表的含义并提供了详细的项目及其控制器.视图等内容的创建步骤,最终完成了一个简单ASP.NET MVC程序. 注:MVC与ASP.NET MVC不相等,MVC是一种开发模式 ...

随机推荐

  1. Noip2017Day1T3 逛公园

    题目链接 problem 一个有向无重边自环图,设\(D\)为从\(1\)号点走到\(n\)号点的最短距离.问有多少条从\(1\)到\(n\)的路径长度不超过\(D+K\).\(K\)为给定的值,且\ ...

  2. 向技术领先的华为说No,就是对国家的通信前景说No!

    历史已经证明了,任何一项可以加速人员.物资.能源.金钱.信息迁移的技术,都会让社会原有的生产力成倍地增长.中国在互联网.移动互联网保持令整个世界震惊的飞速发展,以BAT为首的诸多商业帝国建立,还有人们 ...

  3. python保存文字到文件中

    使用encode方法即可,举例如下: #-*-coding:utf-8-*- def save(re, name): file = open("index_cut.txt", &q ...

  4. 【Linux命令】id,usermod用户管理命令(包括/etc/passwd、shadow、group、gshadow文件)

    一.id命令 可以用来查看用户的UID.GID和附加组信息 id会显示用户以及所属群组的实际与有效ID.若两个ID相同,则仅显示实际ID.若仅指定用户名称,则显示目前用户的ID. 1.格式 id [O ...

  5. win7和win10自带桌面便签哪里找

    一些小伙伴习惯使用windows自带的便签功能,但win7和win10区别较大, 导致更新系统后不知道在哪里找,甚至以为没有该功能了, 其实不然,下面我总结了2种方法,希望能帮到有需要的人 win7( ...

  6. json递归查询

    主体: class json_search(): '''递归查询依赖key''' def search_key(self,data,key): self.data = data self.key_va ...

  7. Oracle基础教程(一)

    本文链接:https://blog.csdn.net/GoldenKitten/article/details/84947386 以下内容为转载以上博客,自己做了略微的补充,如需查看原文,请点击上面的 ...

  8. 用 Python 带你看各国 GDP 变迁

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 周萝卜 源自:萝卜大杂烩 PS:如有需要Python学习资料的小伙伴 ...

  9. 脚本自动统计安卓log中Anr、Crash等出现的数量(Python)

    作为测试,在测试工作中一定会经常抓log,有时log收集时间很长,导致log很大,可能达到几G,想找到能打开如此大的log文件的工具都会变得困难:即使log不大时,我们可以直接把log发给开发同学去分 ...

  10. Winform中在ZedGraph中最多可以添加多少条曲线

    场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...