2015-11-04 4 views
21

Я добавил новое свойство в свою существующую модель. Это свойство bool со значением по умолчанию true. В этой таблице есть существующие данные, и я хотел бы установить новое свойство одной конкретной строки в false сразу после создания нового поля в методе Up.Изменить данные в миграции Метод Up - Entity Framework

public override void Up() 
    { 
     AddColumn("dbo.RequestValidationErrors", "IsBreaking", c => c.Boolean(nullable: false)); 
     using (Context ctx = new Context()) 
     { 
      var validation = ctx.RequestValidationErrorSet.FirstOrDefault(x => x.WordCode == "RequestValidationError.MoreThanOneItemFound"); 
      if (validation != null) 
      { 
       validation.IsBreaking = false; 
       ctx.SaveChanges(); 
      } 
     } 
    } 

Таким образом, EF выдает ошибку во время говоря

System.InvalidOperationException: Модель бэк контекст «DbContext» изменилось с тех пор была создана база данных. Рассмотрим с помощью Code First Миграции для обновления базы данных

Можно ли изменить базу данных здесь, или я должен сделать это в другом месте?

ответ

27

В середине миграции лучше использовать метод Sql() для обновления данных базы данных.

Sql("UPDATE dbo.RequestValidationErrors SET IsBreaking = 0 WHERE WordCode = 'RequestValidationError.MoreThanOneItemFound'"); 

Также вы должны определить значение по умолчанию для нового столбца. Таким образом, решение должно быть что-то вроде этого:

public override void Up() 
{ 
    AddColumn("dbo.RequestValidationErrors", "IsBreaking", c => c.Boolean(nullable: false, default: true)); 
    Sql("UPDATE dbo.RequestValidationErrors SET IsBreaking = 0 WHERE WordCode = \"RequestValidationError.MoreThanOneItemFound\""); 
} 

Использование DbContext, в середине его миграция весьма неоднозначно. Что вы ожидаете от контекста? Он имеет после состояния миграции в своих моделях, но в базе данных есть перед состоянием миграции в таблицах. Таким образом, модель и база данных не соответствуют друг другу. Если вы все еще настаиваете на использовании DbContext в вашем коде, это может быть отключение проверки модели. Вы можете отключить модель проверки с помощью:

Database.SetInitializer<Log4ProContext>(null); 
+0

Благодарим Вас за решение и отсутствующего DefaultValue тоже. – Perrier

7

Если вы хотите использовать рамки для изменений, как это, вы должны отделить изменения базы данных от изменений данных.

Создайте миграцию только для изменений базы данных и выполните.

Затем создайте новую миграцию (методы Up() и Down() будут пустыми). Теперь вы можете создать экземпляр вашего DatabaseContext и не будет ошибок. Таким образом, вы можете использовать Framework для этих изменений и правильно реализовать метод Down().

3

Запись данныхMigrations для EF6 может быть трудоемкой задачей. Мы собрали библиотеку, которую я просто открываю для других, чтобы использовать ее, что добавляет в эту давно обещанную, отсутствующую функцию для EF6. Просто писать классы с использованием регулярных запросов EF и т.д.

https://github.com/b9chris/Brass9.Data