1.Creating a Migration
[Command Line] dotnet ef migrations add <name of migration> [Package Manager console] add-migration <name of migration>创建迁移时,EF会将模型的当前状态与先前的迁移(如果存在)进行比较,并生成一个文件,该文件包含继承自Microsoft.EntityFrameworkCore.Migrations.Migration的类,该类具有Up和Down方法。 该类的名称与您为迁移指定的名称相同。 文件名本身是迁移的名称,带有时间戳。
Up方法包含C#代码,该代码将自上次迁移以来对模型所做的所有更改应用于数据库的架构。 Down方法撤消这些更改,将数据库恢复到先前迁移的状态。 还将创建或更新ModelSnapshot文件,具体取决于先前是否存在。
2.Removing A Migration
[Command Line] dotnet ef migrations remove [Package Manager Console] remove-migration您将使用此命令删除最新的迁移。 这将删除为最新迁移生成的类文件,还将ModelSnapshot文件恢复为先前迁移的状态。 如果没有挂起的迁移,将引发异常。 如果要删除已提交的迁移,则必须先撤消迁移。
您应该始终使用命令删除迁移,而不是简单地删除迁移代码文件,否则快照和迁移将彼此不同步。 然后,将来的迁移将基于不正确的模型。 但是,remove命令将识别迁移文件是否已删除,并将相应地还原快照。
如果需要删除在最近一次迁移之前生成的迁移,则必须首先删除所有后续的迁移,然后调整模型,然后创建新迁移以适应更改。
除非另有说明,否则将应用所有挂起的迁移。 如果这是第一次迁移,则会将一个名为__EFMigrationsHistory的表添加到数据库。 它用于存储此名称以及每个后续迁移应用于数据库的名称。
update 是否生效,取决于数据库中是否已经存在需要被undapte的migration的记录
下面是有更新所执行的sql脚本:
update-database Executed DbCommand (26ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT OBJECT_ID(N'[__EFMigrationsHistory]'); Executed DbCommand (8ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT OBJECT_ID(N'[__EFMigrationsHistory]'); Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT [MigrationId], [ProductVersion] FROM [__EFMigrationsHistory] ORDER BY [MigrationId]; Applying migration '20191030140804_test1'. Executed DbCommand (564ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] ALTER TABLE [Order] DROP CONSTRAINT [FK_Order_User_UserId]; Executed DbCommand (223ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] ALTER TABLE [BpuHier] ADD [BusLongDesc1] varchar(75) NULL; Executed DbCommand (177ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] ALTER TABLE [Order] ADD CONSTRAINT [FK_Order_User_UserId] FOREIGN KEY ([UserId]) REFERENCES [User] ([UserId]) ON DELETE CASCADE; Executed DbCommand (13ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion]) VALUES (N'20191030140804_test1', N'2.1.1-rtm-30846'); Done.没有更新,将执行以下脚本
update-database Executed DbCommand (14ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT OBJECT_ID(N'[__EFMigrationsHistory]'); Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT OBJECT_ID(N'[__EFMigrationsHistory]'); Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT [MigrationId], [ProductVersion] FROM [__EFMigrationsHistory] ORDER BY [MigrationId]; No migrations were applied. The database is already up to date. Done.
Reversing A Migration
要撤消迁移,请将目标迁移的名称传递给update命令。 目标迁移是您要还原数据库的点。 例如,如果您的第一个迁移名为“TEST”,并且您想要还原数据库以删除后续迁移所做的所有更改,则可以将“TEST”传递给update命令:
[Command line] dotnet ef database update TEST [Package Manager Console] update-database TEST此操作将导致在执行所有后续迁移时使用Down方法。 目标迁移后已应用于数据库的所有迁移都将从数据库__EFMigrationsHistory表中删除其条目。 它不会从“迁移”文件夹中删除后续迁移,也不会更改ModelSnapshot文件。 您应该使用remove命令来实现此目的,而不是手动删除迁移文件。
update-database test1 Executed DbCommand (15ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT OBJECT_ID(N'[__EFMigrationsHistory]'); Executed DbCommand (2ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT OBJECT_ID(N'[__EFMigrationsHistory]'); Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT [MigrationId], [ProductVersion] FROM [__EFMigrationsHistory] ORDER BY [MigrationId]; Reverting migration '20191030141207_test2'. Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] EXEC sp_rename N'[BpuHier].[BusLongDesc2]', N'BusLongDesc1', N'COLUMN'; Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] DELETE FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20191030141207_test2'; Done.数据库迁移
在某个阶段,您将需要针对另一个数据库部署一个或多个迁移,无论是测试数据库还是实时生产数据库。 当前,最简单的方法是对目标数据库执行SQL脚本。 您可以通过script命令生成所需的脚本:
[Command Line] dotnet ef migrations script [Package Manager Console] script-migrationdrop-database