【问题标题】:Remove a migration with an empty down method or alter stored procedure from another migration使用 empty down 方法删除迁移或从另一个迁移更改存储过程
【发布时间】:2021-01-25 17:10:34
【问题描述】:

我正在开发一个存储过程,它会生成一些税务数据并将这些数据存储到数据库中的单独表中。不久前,我创建了一个空迁移并将以下内容添加到迁移中以将存储过程添加到数据库。

using Microsoft.EntityFrameworkCore.Migrations;

namespace Tax.Data.Migrations
{
    public partial class sp_Generate5498TaxData : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            var sp = @"USE [TAX_DB]
                GO
                SET ANSI_NULLS ON
                GO
                SET QUOTED_IDENTIFIER ON
                GO
                CREATE PROCEDURE sp_GenerateTaxData

                @Year int
                AS
                BEGIN
                   -- A bunch of SQL that is the stored procedure

                END
                GO";

            migrationBuilder.Sql(sp);
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {

        }
    }
}

不假思索地我添加了迁移,而没有在 down 方法中添加任何内容。现在,我需要更改存储过程,但我不知道如何去做,以免引起其他问题。我最初的想法是删除迁移并添加一个新的,但是由于 down 方法是空的,这会导致任何问题吗?我可以将以下内容写入现有迁移的 down 方法吗?

public override void Down()
    {
        this.Sql("DROP PROCEDURE sp_GenerateTaxData");
    }

我的另一个想法是创建一个新的迁移并添加我的 SQL,而不是说 ALTER PROCEDURE sp_GenerateTaxData 但我再次不确定这样做的副作用是什么。我环顾四周,找不到有关如何最好地做到这一点的信息,因为我最初没有设置 down 方法的错误。关于如何远程迁移现有迁移或添加将更新 SP 的新迁移的任何建议?

【问题讨论】:

    标签: c# entity-framework .net-core


    【解决方案1】:

    在没有 down 方法的情况下添加迁移不一定是错误。这只是意味着,如果您还原迁移,则在还原时不会在数据库中撤消 Up 方法中所做的事情。在这种情况下,从数据库中删除迁移实际上不会从数据库中删除存储过程,因为您没有在 Down 方法中指示它。

    因此,您现在只需编写 Down 方法的代码,指示 EF Core 生成脚本以删除您的存储过程。然后,当取消应用迁移时,EF 将从数据库中删除存储过程。以后再写 Down 代码应该没关系。

    您还可以做的是删除迁移文件,然后从所有涉及的数据库(不同的环境和团队成员的所有本地计算机)手动删除存储过程,这是不切实际的......这就是迁移更多或更少来解决)。但是,如果迁移仅在您的本地数据库和一个暂存环境中应用,您可以手动完成,不会有太多麻烦。

    最后,您也可以按照您的建议在 Up() 方法中添加一个新的迁移并更改过程。

    IMO,您不必那么担心。没有 Down() 方法的唯一问题(在这种情况下)是您不会让脚本通过 EF 自动恢复 Up() 方法中所做的事情(在这种情况下,删除存储过程)。如果迁移正在更改架构并且之后还应用了其他迁移,则问题可能会更大。

    【讨论】:

    • @reusablePants 我认为这实际上不是一个选择。认为如果您在 Up 方法中将其更改为 ALTER PROCEDURE,这意味着数据库必须已经有一个使用这样的名称创建的过程。然后考虑如果一个新开发人员加入您的团队并想要初始化数据库会发生什么:它将开始通过迁移应用迁移,当找到 ALTER PROCEDURE 时会失败,因为最近创建的数据库还没有它
    • @reusablePants 但是,如果您在 UP 方法中编写 ALTER 的地方添加一个新迁移,则可以保证工作,因为在应用该迁移时,之前的带有 CREATE 的迁移将已经被应用.
    • @reusablePants 可以实际工作 :) 请记住,在运行 update-database 时要应用现有迁移的 Up 方法中的新代码,您需要先从数据库的 EFMigrationHistory 表(手动或通过使用 update-database
    • @reusablePants 同样,在执行此操作之前,请确保您在我们讨论的迁移之后没有任何其他迁移。如果这样做,为了再次取消应用和应用迁移(使用更新的脚本),您还必须删除并重新应用所有后向迁移,这可能会导致数据丢失。如果您在创建 SP 之后确实有迁移,我会在最后添加一个新迁移
    • 太棒了!我将按照您之前的建议使用 ALTER PROCEDURE 命令添加新迁移。我只是好奇仅更新现有迁移将如何工作。听起来好像只添加一个新的更安全。
    猜你喜欢
    • 1970-01-01
    • 2012-08-29
    • 2013-03-27
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 2016-04-02
    相关资源
    最近更新 更多