在我在迁移过程中删除它们之前,从另一列填充一个新列

Fill a new colum from another columns before I delete them during migration

我正在使用 Entity Framework - Code First。数据库已经填满。 我必须向 table 添加一个列并删除另外两个列。新列将填充旧列的合并。 我正在尝试使用迁移和种子方法。

我继续我的任务:

  1. 在 table;
  2. 中添加一列
  3. 用其他两列的数据填充新列;
  4. 删除其他两列。

这是我的迁移:

public partial class MyNewMigration : DbMigration
{
    public override void Up()
    {
        AddColumn("customers.myTable", "newCol", c => c.String());
        DropColumn("customers.myTable", "oldCol1");
        DropColumn("customers.myTable", "oldCol2");
    }

    public override void Down()
    {
        AddColumn("customers.myTable", "oldCol1", c => c.String());
        AddColumn("customers.myTable", "oldCol2", c => c.String());
        DropColumn("customers.myTable", "newCol");
    }
}

我是否必须在 Up 方法中添加代码来填充新列?

Do I must add the code to fill the new column inside the Up method?

是的,您需要转换数据!在复杂的数据转换中,您可能需要 Sql 函数或存储过程。

例如,您可以在迁移文件中执行以下操作:

AddColumn("customers.myTable", "newCol", c => c.String());
Sql("UPDATE customers.myTable SET newCol= ''");

Sql("Update customers.myTable SET newCol = oldCol1+ oldCol2");

正如我之前提到的,如果您需要复杂的数据转换,则必须使用带有 input/output 参数的存储过程或函数,并且您必须先添加它们,然后才能将它们与Sql 命令。

您也可以使用迁移种子。种子方法在每个迁移级别之间调用,例如,如果您有迁移级别 1、2、3,那么它将被调用 3 次。 seed 方法的问题是,您必须在一个文件中为所有迁移级别构建迁移逻辑。您可以使用 switch case 或 if else 然后检查您处于哪个级别。如果您处于级别 1,则可以添加迁移级别 1 的代码逻辑,如果您处于级别 2,则必须添加级别 2 等的代码。这个方法对我来说并不干净,如果你想使用它,那么将它与工厂模式一起使用,允许为每个迁移级别 (SRP) 分配代码。两个方法都做同样的事情,这取决于你。