实体框架迁移如何从前一个表中种子数据

时间:2014-07-16 06:06:13

标签: entity-framework ef-migrations

我有一个类型时间的列,我需要更改为输入bigint。 在我看来,唯一的方法是删除列并创建一个bigint类型的新列。

为此,我将运行以下迁移:

public partial class Migration1 : DbMigration
{
    public override void Up()
    {
        DropColumn("dbo.MyDurations", "Duration");
        AddColumn("dbo.MyDurations", "Duration", c => c.Long(nullable: false));
    }

    public override void Down()
    {
        DropColumn("dbo.MyDurations", "Duration");
        AddColumn("dbo.MyDurations", "Duration", c => c.Time(nullable: false, precision: 7));
    }
}

如何通过时间类型获取当前列中的数据,并通过使用TimeSpan.Ticks(duration)转换它来将其播种到新列?

根据我的理解,我只能从配置文件中的Seed(DbContext ctx)函数中提取数据。但种子方法是在迁移后运行的。 是否可以在应用迁移之前访问数据,然后应用迁移然后播种数据?

1 个答案:

答案 0 :(得分:2)

您可以使用Sql方法在迁移中运行自己的Sql。您需要将迁移更改为以下内容:

public override void Up()
{

    AddColumn("dbo.MyDurations", "NewDuration", c => c.Long(nullable: false));
    Sql("UPDATE dbo.MyDurations SET NewDuration = Duration");
    DropColumn("dbo.MyDurations", "Duration");
    RenameColumn("dbo.MyDurations", "NewDuration", "Duration");
}