使用EF Core Migrations可以使Entity & DbContext的配置与数据库保持一致,Migrations可以非常容易的将创建和更新数据库,当一个项目在开发过程中时,程序员能保证实体更新,因此他们需要运行Migration保证数据库是最新.
1 如何运行Migrations
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关联的信息
3 Update Migration 命令
PM> dotnet ef database update
PM> Update-Database
4 使用 –context 关键字
如果应用程序有多个Database Context文件,可以使用–context关键字指定DbContext文件迁移目标,我们可以指定migration目标是EmployeeContext.cs
PM> dotnet ef migrations add Migration1 --context EmployeeContext
PM> 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; }
}
public string Address { get; set; }
PM> dotnet ef migrations add Migration1
PM> dotnet ef database update
PM> dotnet ef database update 20230410151307_migrations
PM> dotnet ef migrations remove
6 Remove Migration 命令
如果没有提交数据库可以使用Remove Migration 命令来移除最新的migration,我们移除之后的migration如果没有提交到数据库,针对这个我们能执行下面两个命令其中的任何一个:
PM> dotnet ef migrations remove
or
PM> remove-migration
如果migration 已经提交到数据库,我们将会收到下面错误
7 删除数据库
PM> dotnet ef database drop
或者
PM> Drop-Database
PM> dotnet ef migrations script
PM> script-migration
这个命令将会针对所有的migrations生成一个脚本,如果我们有这个需求,我们可以使用这个脚本生成一个数据库的副本
PM> dotnet ef migrations script
Build started...
Build succeeded.
IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL
BEGIN
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>
总结