20.2.翻译系列:EF 6中基于代码的数据库迁移技术EF 6 Code-First系列
Posted caofangsheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20.2.翻译系列:EF 6中基于代码的数据库迁移技术EF 6 Code-First系列相关的知识,希望对你有一定的参考价值。
原文链接:https://www.entityframeworktutorial.net/code-first/code-based-migration-in-code-first.aspx
在前面的一节中,你学习了自动迁移技术,当实体改变的时候,自动进行数据库迁移。这里你将会学习基于代码的数据库迁移技术。
基于代码的数据库迁移技术,在迁移的时候,提供了更多的控制。例如允许你配置添加额外的字符串,例如设置列的默认值,配置计算列等等。
为了使用基于代码的数据库迁移,你需要在程序包管理控制台中输入:
- Enable-Migrations:在项目中启用数据库迁移,然后会创建一个Configuration类
- Add-Migration:创建了一个迁移类,其中指定了Up和Down方法。
- Update-Database:执行Add_migration指令中创建的迁移,将改变应用到数据库中。
为了使用基于代码的数据库迁移,首先在程序包管理控制台中执行enable-migrations命令。
Enable-Migrations指令会创建Configuration类,这个Configuration类继承自DbMigrationsConfiguration
,Configuration类中包含这句代码:AutomaticMigrationsEnabled = false
.
现在你需要在上下文类中设置数据库初始化策略为MigrateDatabaseToLatestVersion
:
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命令创建一个迁移类 ,后面跟着迁移类的名称:
上面的命令将会创建一个时间戳_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
以上是关于20.2.翻译系列:EF 6中基于代码的数据库迁移技术EF 6 Code-First系列的主要内容,如果未能解决你的问题,请参考以下文章
20.翻译系列:Code-First中的数据库迁移技术EF 6 Code-First系列
15.翻译系列:EF 6中的级联删除EF 6 Code-First 系列
9.6 翻译系列:数据注解之Index特性EF 6 Code-First系列