原文连接:https://www.entityframeworktutorial.net/code-first/code-based-migration-in-code-first.aspxhtml
EF 6 Code-First系列文章目录:数据库
在前面的一节中,你学习了自动迁移技术,当实体改变的时候,自动进行数据库迁移。这里你将会学习基于代码的数据库迁移技术。app
基于代码的数据库迁移技术,在迁移的时候,提供了更多的控制。例如容许你配置添加额外的字符串,例如设置列的默认值,配置计算列等等。ide
为了使用基于代码的数据库迁移,你须要在程序包管理控制台中输入:学习
为了使用基于代码的数据库迁移,首先在程序包管理控制台中执行enable-migrations命令。测试
Enable-Migrations指令会建立Configuration类,这个Configuration类继承自DbMigrationsConfiguration
,Configuration类中包含这句代码:AutomaticMigrationsEnabled = false
.ui
如今你须要在上下文类中设置数据库初始化策略为MigrateDatabaseToLatestVersion
:spa
public class SchoolContext: DbContext { public SchoolDBContext(): base("SchoolDB") { Database.SetInitializer(new MigrateDatabaseToLatestVersion<SchoolDBContext, EF6Console.Migrations.Configuration>()); } public DbSet<Student> Students { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { } }
如今使用Add-Migration命令建立一个迁移类 ,后面跟着迁移类的名称:.net
上面的命令将会建立一个时间戳_SchoolDB-v1.cs文件,类里面包含Up和Down方法:翻译
正如你所见,Up方法包含建立数据库对象的代码,而且Down方法包含删除数据库的代码。你一样能够编写代码,进行额外的配置。这就是优于自动迁移的地方。
为了了解更多add-migrations命令参数,你能够执行get-help add-migration或者get-help add-migration -detailed:
PM> get-help add-migration NAME Add-Migration SYNOPSIS Scaffolds a migration script for any pending model changes. SYNTAX Add-Migration [-Name] <String> [-Force] [-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] [-ConnectionStringName <String>] [-IgnoreChanges] [-AppDomainBaseDirectory <String>] [<CommonParameters>] Add-Migration [-Name] <String> [-Force] [-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] -ConnectionString <String> -ConnectionProviderName <String> [-IgnoreChanges] [-AppDomainBaseDirectory <String>] [<CommonParameters>] DESCRIPTION Scaffolds a new migration script and adds it to the project. RELATED LINKS REMARKS To see the examples, type: "get-help Add-Migration -examples". For more information, type: "get-help Add-Migration -detailed". For technical information, type: "get-help Add-Migration -full".
在使用Add-Migration命令以后,你须要更新数据库。经过执行Update-Database命令,来提交修改到数据库中,还能够在后面加上–verbose 就能够看到生成的SQL脚本:
执行get-help update-database或者get-help update-database -detailed命令:
PM> get-help update-database NAME Update-Database SYNOPSIS Applies any pending migrations to the database. SYNTAX Update-Database [-SourceMigration <String>] [-TargetMigration <String>] [-Script] [-Force] [-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] [-ConnectionStringName <String>] [-AppDomainBaseDirectory <String>] [<CommonParameters>] Update-Database [-SourceMigration <String>] [-TargetMigration <String>] [-Script] [-Force] [-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] -ConnectionString <String> -ConnectionProviderName <String> [-AppDomainBaseDirectory <String>] [<CommonParameters>] DESCRIPTION Updates the database to the current model by applying pending migrations. RELATED LINKS REMARKS To see the examples, type: "get-help Update-Database -examples". For more information, type: "get-help Update-Database -detailed". For technical information, type: "get-help Update-Database -full".
到这个时候,数据库就被建立或更新了,如今无论何时,模型发生改变的时候,执行Add-Migration 带上参数名,就建立一个新的迁移文件,而后执行Update-Database命令,就将修改提交到数据库了。
迁移回退
假设你想要回退到以前的任何一个状态,那么你能够执行update-database后面跟着–TargetMigration,指定你想要回退的版本。例如,假设SchoolDB数据库有不少迁移记录,可是你想回退到第一个版本,那么你能够执行下面的代码:
PM> update-database -TargetMigration:SchoolDB-v1