Entity Framework Core Migrations

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命令将识别迁移文件是否已删除,并将相应地还原快照。

如果需要删除在最近一次迁移之前生成的迁移,则必须首先删除所有后续的迁移,然后调整模型,然后创建新迁移以适应更改。

 

Applying A Migration

[Command line]
dotnet ef database update

[Package Manager Console]
update-database

.net core 代码
private void InitializeDatabase(IApplicationBuilder app)
{
    using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
    {
        serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
}
}

除非另有说明,否则将应用所有挂起的迁移。 如果这是第一次迁移,则会将一个名为__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-migration

数据库删除

drop-database

 

Executing Custom SQL

public partial class CreateDatabase : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.Sql("Some custom SQL statement");

        migrationBuilder.CreateTable(
            name: "Authors",
            columns: table => new
            {
                AuthorId = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                FirstName = table.Column<string>(nullable: true),
                LastName = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Authors", x => x.AuthorId);
            });
PM> get-help entityframework

                     _/\__
               ---==/    \\
         ___  ___   |.    \|\
        | __|| __|  |  )   \\\
        | _| | _|   \_/ |  //|\\
        |___||_|       /   \\\/\\

TOPIC
    about_EntityFramework

SHORT DESCRIPTION
    Provides information about Entity Framework commands.

LONG DESCRIPTION
    This topic describes the Entity Framework commands. Entity Framework is Microsoft's recommended data access technology for new
    applications.

    The following Entity Framework cmdlets are included.

        Cmdlet                      Description
        --------------------------  ---------------------------------------------------
        Add-Migration		    Adds a new migration.

        Remove-Migration	    Removes the last migration.

        Scaffold-DbContext	    Scaffolds a DbContext and entity type classes for a specified database.

        Script-Migration	    Generates a SQL script from migrations.

        Update-Database		    Updates the database to a specified migration.

        Use-DbContext               Sets the default DbContext to use.

SEE ALSO
    Add-Migration
    Remove-Migration
    Scaffold-DbContext
    Script-Migration
    Update-Database
    Use-DbContext

版权声明:本文为xiaomifengmaidi1原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。