在No Magic Migration中转换列类型

时间:2013-11-13 12:34:29

标签: c# entity-framework database-migration ef-migrations

我有一个包含TimeSpan类型属性的实体。我们决定将该属性从 TimeSpan 更改为 Int (分钟)。 我现在想要将此更改迁移如下:

从旧列(TimeSpan)中检索每个条目并将其转换为minute(Int)并将其添加到新创建的列中。

在哪里/最好的方法是什么?我应该在Seed方法中做到吗?!我认为,这是不可能的,因为迁移完成后会调用Seed

Up()方法中的第二种方法。这是一个好主意吗?将列数据复制/转换为Up方法中的另一列。

public partial class V30 : DbMigration
{
     public override void Up()
     {

      AddColumn("dbo.Plexes", "ISingleIsValidTimeInMinutes", c => c.Int(nullable: false));

      // I NEED HERE TO TRANSFER THE DATA FROM ISingleIsValidTime TO ISingleIsValidTimeInMinutes ?!!!
      TransformISingleIsValidTimeToInt();

      DropColumn("dbo.Plexes", "ISingleIsValidTime");
     }
....
}

private void TransformISingleIsValidTimeToInt()
{
  // HERE CONVERTING LOGIC I NEED THE EXISITNG DATA FROM DBCONTEXT!!
}

 public class NoMagicDatabaseConfiguration : DbMigrationsConfiguration<ApplicationDbContext>
 {

   public NoMagicDatabaseConfiguration()
   {
    this.AutomaticMigrationsEnabled = false;
    this.AutomaticMigrationDataLossAllowed = false;
   }

   protected override void Seed(ApplicationDbContext context)
   {
    base.Seed(context);
   }
 }

1 个答案:

答案 0 :(得分:1)

最简单(也可能是最快)的方法是使用Sql方法运行SQL语句,类似于:

public override void Up()
{
  AddColumn("dbo.Plexes", "ISingleIsValidTimeInMinutes", c => c.Int(nullable: false));
  Sql("UPDATE Plexes SET ISingleIsValidTimeInMinutes = -DATEDIFF(MINUTE, ISingleIsValidTime, 0)");
  DropColumn("dbo.Plexes", "ISingleIsValidTime");
}

或者,如果您想单独使用EF来解决此问题,您可以在向上迁移期间实例化您在添加和删除列之间的上下文并在那里进行工作,但如果您有很多行,则可能需要而