在我在迁移过程中删除它们之前,从另一列填充一个新列
Fill a new colum from another columns before I delete them during migration
我正在使用 Entity Framework - Code First。数据库已经填满。
我必须向 table 添加一个列并删除另外两个列。新列将填充旧列的合并。
我正在尝试使用迁移和种子方法。
我继续我的任务:
- 在 table;
中添加一列
- 用其他两列的数据填充新列;
- 删除其他两列。
这是我的迁移:
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) 分配代码。两个方法都做同样的事情,这取决于你。
我正在使用 Entity Framework - Code First。数据库已经填满。 我必须向 table 添加一个列并删除另外两个列。新列将填充旧列的合并。 我正在尝试使用迁移和种子方法。
我继续我的任务:
- 在 table; 中添加一列
- 用其他两列的数据填充新列;
- 删除其他两列。
这是我的迁移:
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) 分配代码。两个方法都做同样的事情,这取决于你。