Изменение данных в методе миграции Up - Entity Framework

Я добавил новое свойство в свою существующую модель. Это свойство bool со значением по умолчанию true. В этой таблице есть существующие данные, и я хотел бы установить одно значение свойства new row new сразу после создания нового поля в методе Up.

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" изменился с момента создания базы данных. Рассмотрите возможность использования First First Migrations для обновления базы данных

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

Ответы

Ответ 1

В середине миграции лучше использовать метод 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\"");
}

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

Database.SetInitializer<Log4ProContext>(null);

Ответ 2

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

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

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

Ответ 3

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

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