0

У меня есть объект, который содержит свойство типа TimeSpan. Мы решили изменить имущество от TimeSpan до Int (минуты). My Idea теперь необходимо изменить следующим образом:Преобразование типа столбца в No Magic Migration

Извлечение каждой записи из старого столбца (TimeSpan) и преобразование ее в минуту (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

Самый простой (и, вероятно, самый быстрый) способ будет запускать 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, вы можете создать экземпляр своего контекста во время миграции между добавлением и удалением столбцов и выполнить там работу, но если у вас много строк, это может занять некоторое время

+0

, но проблема типа столбца; Timespan -> int тип изменяется; Мне нужно сделать некоторые логические преобразования! Возможно решить эту проблему с помощью EF или мне нужна хранимая процедура для изменения данных на сервере! ???? –

+1

Если вы хотите решить эту проблему с помощью только EF, вы можете создать экземпляр своего контекста во время миграции между добавлением и удалением столбцов и выполнять там работу, но если у вас много строк, это может занять некоторое время. – ESG

+0

Я буду держать это в качестве последней души для проблемы; Теперь я собираю информацию о MigrationOperation и надеюсь, что смогу найти что-то таким образом; Спасибо за помощь. –

Смежные вопросы