Entity Framework Core系列教程-26-数据迁移

Entity Framework Core数据迁移

迁移是一种通过保留数据来使数据库架构与EF Core模型保持同步的方法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K5pXisZH-1581165405062)(d:\note\efcore\pic\28.png)]
如上图所示,EF Core API从域(实体)类构建EF Core模型,并且EF Core迁移将基于EF Core模型创建或更新数据库架构。每当更改域类时,都需要运行迁移以使数据库架构保持最新。
EF Core迁移是一组命令,您可以在NuGet软件包管理器控制台或dotnet命令行界面(CLI)中执行。
下表列出了EF Core中的重要迁移命令。

程序包管理器控制台命令 dotnet 命令行命令 使用方法
add-migration <migration name> Add <migration name> 通过添加迁移快照来创建迁移
Remove-migration Remove 删除最后一个迁移快照
Update-database Update 根据上一个迁移快照更新数据库架构
Script-migration Script 使用所有迁移快照生成SQL脚本

添加迁移

第一次,您定义了初始领域类。此时,您的应用程序没有数据库可以存储您的域类中的数据。因此,首先,您需要创建一个迁移。

从Visual Studio中的工具-> NuGet软件包管理器->软件包管理器控制台中打开软件包管理器控制台,然后执行以下命令以添加迁移。

add-migration MyFirstMigration

如果使用的是dotnet命令行界面,请执行以下命令。

dotnet ef migrations add MyFirstMigration

在以上命令中,MyFirstMigration是迁移的名称。这将在项目的“迁移”文件夹中创建三个文件,如下所示。
在这里插入图片描述

  1. <timestamp>_<迁移名称>.cs:主迁移文件,其中包含Up()和Down()方法中的迁移操作。 Up()方法包括用于创建数据库对象的代码,而Down()方法包括用于删除数据库对象的代码。
  2. <时间戳>_<迁移名称>.Designer.cs:迁移元数据文件,其中包含EF Core使用的信息。
  3. <contextclassname> ModelSnapshot.cs:当前模型的快照。这用于确定在创建下一个迁移时所做的更改。
    现在,在创建迁移快照之后,该创建数据库了。

创建或更新数据库

使用以下命令创建或更新数据库架构。

  1. 程序包管理器控制台
Update-Database
  1. dotnet 命令行
dotnet ef database update

Update命令将基于上下文和域类以及迁移快照创建数据库,这些快照是使用add-migration或add命令创建的。
如果这是第一次迁移,则还将创建一个名为__EFMigrationsHistory的表,该表将存储所有迁移的名称以及何时将它们应用于数据库。
在这里插入图片描述

删除迁移

如果上一次迁移未应用到数据库,则可以将其删除。使用以下remove命令删除上一次创建的迁移文件并还原模型快照。

  1. 程序包管理器控制台
remove-migration
  1. dotnet 命令行
dotnet ef migrations remove

上面的命令将删除上一次迁移,并将模型快照还原为之前的迁移。请注意,如果已将迁移应用于数据库,则它将引发以下异常。
迁移<迁移名称>已被应用于数据库。还原它,然后再试一次。如果已将迁移应用于其他数据库,请考虑使用新迁移来还原其更改。

还原迁移

假设您更改了域类,并使用add-migration命令创建了名为MySecondMigration的第二个迁移,并使用Update命令将该迁移应用于数据库。但是,由于某种原因,您想将数据库还原到以前的状态。在这种情况下,请使用update-database <迁移名称>命令将数据库还原到指定的先前迁移快照。

  1. 程序包管理器控制台
Update-database MyFirstMigration
  1. dotnet 命令行
dotnet ef database update MyFirstMigration

上面的命令将基于名为MyFirstMigration的迁移还原数据库,并删除应用于名为MySecondMigration的第二个迁移的所有更改。这还将从数据库的__EFMigrationsHistory表中删除MySecondMigration条目。

注意:这不会删除与MySecondMigration相关的迁移文件。使用remove命令将其从项目中删除。

生成SQL脚本

使用以下命令为数据库生成SQL脚本。

  1. 程序包管理器控制台
script-migration
  1. dotnet 命令行
dotnet ef migrations script

上面的脚本命令默认将包含所有迁移的脚本。您可以使用-to和-from选项来指定迁移范围。

程序包管理器控制台命令进行迁移

可以使用Visual Studio中的程序包管理器控制台执行Entity Framework Core中的迁移命令。从Visual Studio中的工具-> NuGet软件包管理器->软件包管理器控制台中打开软件包管理器控制台,以执行以下命令。

程序包管理器控制台 用法
Get-Help entityframework 获取帮助entityframework显示有关实体框架命令的信息
Add-Migration <迁移名称>通过添加迁移快照来创建迁移
Remove-Migration 删除最后一个迁移快照
Update-Database 根据上一个迁移快照更新数据库架构
Script-Migration 使用所有迁移快照生成SQL脚本
Scaffold-DbContext 为指定的数据库生成DbContext和实体类型类。这称为逆向工程
Get-DbContext 获取有关DbContext类型的信息
Drop-Database 删除数据库

Get-Help 获取帮助

get-help entityframework

Add-Migration 添加迁移

get-help entityframework

Remove-Migration 删除迁移

get-help entityframework

Update-Database 更新数据库

get-help entityframework

Script-migration 脚本迁移

get-help entityframework

scaffold-dbcontext 支架数据库上下文

get-help entityframework

Get-DbContext

get-help entityframework

Drop-Database 删除数据库

get-help entityframework

用于迁移的命令行界面命令

使用.NET Core Command List Interface执行实体框架核心命令。要使用.NET CLI,请通过编辑.NET Core项目的.csproj文件,在<ItemGroup>节点下添加<DotNetCliToolReference Include =“ Microsoft.EntityFrameworkCore.Tools.DotNet” Version =“ 2.0.0” />。
打开命令提示符,然后导航到项目的根文件夹,然后输入dotnet ef --help列出EF Core命令,如下所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cD0PztSl-1581165405066)(d:\note\efcore\pic\31.png)]

正如您在上面看到的,有三个主要的EF命令可用:数据库,dbcontext和迁移。下表列出了所有EF命令和子命令。

命令 子命令 用法
Database drop 删除数据库
update 将数据库更新为指定的迁移
DbContext info 获取有关DbContext类型的信息
list 列出可用的DbContext类型
scaffold 为数据库提供DbContext和实体类型
Migration add 添加新的迁移
list 列出可用的迁移
remove 删除上一次迁移
script: 从迁移生成SQL脚本

让我们看看每个命令的可用选项。

Database Drop

dotnet ef database drop

Database Update

dotnet ef database update

DbContext Info

dotnet ef dbcontext info

DbContext List

dotnet ef dbcontext list

DbContext Scaffold

dotnet ef dbcontext scaffold

Add

dotnet ef migrations add

List

dotnet ef migrations list

Remove

dotnet ef migrations remove

Script

dotnet ef migrations script
posted @ 2020-02-08 20:39  星空天宇  阅读(241)  评论(0编辑  收藏  举报