2013-09-07 2 views
4

У меня есть объект со свойством строки, которые мне нужно экстернализовать другой набор объектов:Entity Framework 5 Миграции миграция данных

public class MyEntity 
{ 
    public int Id { get; set; } 
    public string FavoriteColor { get; set; } 
} 

Я хотел бы изменить это:

public class MyEntity 
{ 
    public int Id { get; set; } 
    public Color FavoriteColor { get; set; } 
    public int FavoriteColorId { get; set; } 
} 

public class Color 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Если я создаю миграцию, она создает новую таблицу «Цвет» в db, а затем добавляет новые столбцы в «MyEntity». Как я могу гарантировать, что я не потеряю все данные, которые существуют в виде строки в «MyEntity», ? Я попытался загрузить DbContext в перенос, чтобы создать новые «цветные» сущности на основе строковых данных в «MyEntity», но у него есть проблемы, поскольку он обнаруживает, что модель не синхронизирована с текущей схемой.

ответ

3

В вашем проекте, перейдите к окну диспетчера пакетов и:

  1. Включение миграции: Enable-Migrations
  2. Создание миграции: Add-Migration Initial
  3. Создать обновление/понижение сценария: Update-Database

В в случае, если вы добавляете новую таблицу (Color) и два новых столбца.

У вас есть причина, если вы запустите свой сайт, будут удалены FavoriteColor, включая его данные.

Что вы можете сделать:

В консоли диспетчера пакетов при запуске Add-Migration Initial, который будет создавать новый скрипт (# файл C). Как вы можете видеть в этом файле, удаляется один столбец, 2 добавлены и 1 таблица создана.

Убедитесь, что таблица создана перед столбцами, заполняет ее данными, создает 2 столбца с существующими данными на основе старого столбца, а затем удаляет столбец.

Другой способ (возможно, лучше) сделать это в нескольких сценариях миграции, вы также можете использовать метод для заполнения данных.

1

При создании миграции с помощью Add-Migration, миграция файл будет эшафот как:

Up() 
{ 
    CreateTable("dbo.Color"...); 
    DropColumn("FavoriteColor"); 
    AddColumn("FavoriteColor", c=>Int(nullable: false)); 

// Some other code 
} 

вы можете изменить этот файл для реализации миграции данных тоже.

Up() 
{ 
    CreateTable("dbo.Color"...); 
    AddColumn("FavoriteColor", c=>Int(nullable: false)); 

    Sql("INSERT INTO dbo.Color (Id, Name) SELECT DISTINCT FavoriteColor FROM dbo.MyEntity"); 

    // And the other data corrections here using Sql() method. 

    DropColumn("FavoriteColor"); 

// Some other code 
} 
Смежные вопросы