Изменение данных в методе миграции 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