ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

时间:2021-07-05 07:30:45

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

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

  本文要点:

  ●启用Migrations
  ●通过Add-Migration添加Migration
  ●Update-Database更新数据库
  ●更新模型并添加新的Migration
  ●启动应用时自动将数据库更新至最新版本
  ●关于Automatic Migrations(自动迁移)

启用Migrations

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

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

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

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

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

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

   ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

通过Add-Migration添加Migration

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

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

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

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

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

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

 

Update-Database更新数据库

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

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

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

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

更新模型并添加新的Migration

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

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations 

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

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

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

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

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

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

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

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

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

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

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

  1. 添加ClickCount属性:

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

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

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

  3. 运行程序:

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

  4. 查看结果:

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

关于Automatic Migrations(自动迁移)

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

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

  ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

  自动更新数据库(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

  https://coding.abel.nu/2012/03/ef-migrations-command-reference/#Update-Database

 

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

ASP.NET没有魔法——目录