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

在前面的一节中,你学习了自动迁移技术,当实体改变的时候,自动进行数据库迁移。这里你将会学习基于代码的数据库迁移技术。

基于代码的数据库迁移技术,在迁移的时候,提供了更多的控制。例如允许你配置添加额外的字符串,例如设置列的默认值,配置计算列等等。

为了使用基于代码的数据库迁移,你需要在程序包管理控制台中输入:

  1. Enable-Migrations:在项目中启用数据库迁移,然后会创建一个Configuration类
  2. Add-Migration:创建了一个迁移类,其中指定了Up和Down方法。
  3. 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系列

14.翻译系列:从已经存在的数据库中生成上下文类和实体类EF 6 Code-First系列

在EF代码中使用View首先与迁移冲突

EF CodeFirst简介默认约定数据库初始化策略