【问题标题】:Fill a new colum from another columns before I delete them during migration在迁移期间删除其他列之前填充新列
【发布时间】:2016-10-30 19:51:53
【问题描述】:

我正在使用实体框架 - 代码优先。数据库已填满。 我必须在表格中添加一列并删除另外两列。新列将填充旧列的合并。 我正在尝试使用迁移和种子方法。

我继续我的任务:

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

这里是我的迁移:

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 方法中的新列吗?

【问题讨论】:

标签: entity-framework code-first entity-framework-migrations seeding


【解决方案1】:

我必须添加代码来填充 Up 方法中的新列吗?

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

例如你可以在你的迁移文件中做:

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

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

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

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

【讨论】:

  • 谢谢,但是此时我不明白种子方法的含义。。我不能每次迁移都有一个种子方法吗?还是种子方法仅用于初始化数据库?初始化数据库时可以不使用相同的方法吗?看起来有两种不同的方法可以做同样的事情!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 2012-07-20
  • 2019-06-06
  • 2020-01-19
相关资源
最近更新 更多