我有一个类型时间的列,我需要更改为输入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)
函数中提取数据。但种子方法是在迁移后运行的。
是否可以在应用迁移之前访问数据,然后应用迁移然后播种数据?
答案 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");
}