0

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

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

在哪里/什么是最好的方法?我应该用种子方法吗?!我认为,这是不可能的,因为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);
   }
 }
4

1 回答 1

1

The easiest (and probably quickest) way would be to run a SQL statement with the Sql method, something along the lines of :

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");
}

Alternatively, if you want to solve this problem using EF alone, you could instantiate your context during the up migration between adding and removing the columns and do the work there, but if you have a lot of rows, it could take a while

于 2013-11-13T12:51:37.727 回答