Entity Framework Core-Migrations

使用EF Core Migrations可以使Entity & DbContext的配置与数据库保持一致,Migrations可以非常容易的将创建和更新数据库,当一个项目在开发过程中时,程序员能保证实体更新,因此他们需要运行Migration保证数据库是最新.

1 如何运行Migrations

在Package Manager Console中运行EF Core Migrations,
我们可以使用.NET Core command-line interface(CLI)或者Package Manager Console (PMC)的任何一个工具来做迁移
运行下面命令安装CLI Tools
dotnet tool install --global dotnet-ef

如果你已经安装了,运行下面命令更新到最新版本

dotnet tool update --global dotnet-ef

运行下面命令安装PMC工具

Install-Package Microsoft.EntityFrameworkCore.Tools
接下来我们看一下迁移命令

2 Add Migration 命令

Add Migration命令将创建迁移文件,你的DbContext和Entity 将存储到该文件夹下,在Tools->NuGet Package Manager->Package Manager Console 执行下面两个命令中的任何一个来创建迁移文件:

PM> dotnet ef migrations add Migration1

或者

PM> add-migration Migration1

这里migration名称是Migration1,你可以叫个自己喜欢的名字,migration命令将在应用程序根目录下创建一个Migrations文件夹,这个文件夹下包含3个文件:

_.cs:主要migration文件,包含migration操作Up()和Down()方法, Up方法负责创建DB对象,Down方法移除他们

_.Designer.cs:migration元数据文件包含DB关联的信息

ModelSnapshot.cs:当前模型的快照,用于确定在创建下一次迁移时发生了什么变化

3 Update Migration 命令

Update Migration 命令将最新的迁移更新到数据库,如果数据库不存在,他将创建一个新的数据库,如果存在,会根据给予的迁移文件进行更新数据库
我们能运行下面2个命令的任何一个来更新数据库:
PM> dotnet ef database update
或者
PM> Update-Database
每次migration更新结束,我们会发现创建了一个新的数据库,数据库中有个表叫_EFMigrationsHistory ,该表存储了所有提交的migrations名称

4 使用 –context 关键字

如果应用程序有多个Database Context文件,可以使用–context关键字指定DbContext文件迁移目标,我们可以指定migration目标是EmployeeContext.cs

PM> dotnet ef migrations add Migration1 --context EmployeeContextPM> dotnet ef database update --context EmployeeDbContext

5 回退数据库

使用EF Core回退数据库是非常容易的,让我们看一个例子,我们前面有个Client实体类并且我们有个数据库已经包含了"Client"表:

public class Client{    public int Id { get; set; }    public string Name { get; set; }    public string Country { get; set; }    public string TelephoneNo { get; set; }    public string Email { get; set; }  }
假如,我们决定在属性类中添加一个"Address" 属性:
public string Address { get; set; }
使用EF Core Migration将字段更新到Client表中 
PM> dotnet ef migrations add Migration1PM> dotnet ef database update
我们在数据库Client表中获取到了刚才添加的address字段

Entity Framework Core-Migrations

假如一些特殊情况下,我们需要将数据库回退到之前的版本状态,当客户端表不需要Address字段时,我们需要移除Address属性在Client表中,执行如下命令
PM> dotnet ef database update 20230410151307_migrationsPM> dotnet ef migrations remove

6 Remove Migration 命令

如果没有提交数据库可以使用Remove Migration 命令来移除最新的migration,我们移除之后的migration如果没有提交到数据库,针对这个我们能执行下面两个命令其中的任何一个:

PM> dotnet ef migrations removeorPM> remove-migration

如果migration 已经提交到数据库,我们将会收到下面错误

Entity Framework Core-Migrations

7 删除数据库

使用下面任何一个命令来删除数据库
PM> dotnet ef database drop

或者

PM> Drop-Database
8 生成SQL 脚本
我们也能生成SQL 数据库的SQL脚本,执行下面2个命令中的任何一个来完成这个工作:
PM> dotnet ef migrations script
PM> script-migration

这个命令将会针对所有的migrations生成一个脚本,如果我们有这个需求,我们可以使用这个脚本生成一个数据库的副本

PM> dotnet ef migrations scriptBuild started...Build succeeded.IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULLBEGIN    CREATE TABLE [__EFMigrationsHistory] (        [MigrationId] nvarchar(150) NOT NULL,        [ProductVersion] nvarchar(32) NOT NULL,        CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])    );END;GO
BEGIN TRANSACTION;GO
CREATE TABLE [Clients] (    [Id] int NOT NULL IDENTITY,    [Name] nvarchar(max) NOT NULL,    [Country] nvarchar(max) NOT NULL,    [TelephoneNo] nvarchar(max) NOT NULL,    [Email] nvarchar(max) NOT NULL,    CONSTRAINT [PK_Clients] PRIMARY KEY ([Id]));GO
INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])VALUES (N'20230410151307_migrations', N'7.0.4');GO
COMMIT;GO
BEGIN TRANSACTION;GO
ALTER TABLE [Clients] ADD [Address] nvarchar(max) NOT NULL DEFAULT N'';GO
INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])VALUES (N'20230410151612_migrations1', N'7.0.4');GO
COMMIT;GO
BEGIN TRANSACTION;GO
INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])VALUES (N'20230410151721_migrations2', N'7.0.4');GO
COMMIT;GO
PM>

总结

这节我们主要学习了Entity Frame Core Migrations常用的相关命令
源代码地址:
https://github.com/bingbing-gui/Asp.Net-Core-Skill/tree/master/EntityFrameworkCore/EFCoreMigration