Entity Framework: Добавить столбец требует изменения данных Seed?
Во -первых, я почти уверен, что об этом, должно быть, спрашивали раньше, но не смогли найти точного ответа с помощью поиска в Google, поэтому, пожалуйста, потерпите меня.
Я унаследовал первый проектный фреймворк, который использует миграции. Я добавил (не обнуляемый) столбец в таблицу, и мне нужно вставить значения в этот столбец для всех существующих записей, которые не являются значением по умолчанию:
public override void Up()
{
AddColumn("dbo.QuestionType", "Duplicated", c => c.Boolean(nullable: false, defaultValue: false));
Sql("UPDATE dbo.QuestionType SET Duplicated = 1");
}
Однако первоначально в эту таблицу были добавлены начальные данные:
context.QuestionTypes.AddOrUpdate(
e => e.Name,
new QuestionType() { Name = QuestionTypeNames.INTERVIEWER});
Это означает, что оператор обновления немедленно перезаписывается данными в вызове метода Seed (вызывается после каждой миграции).
Мои вопросы:
- Безопасно ли просто добавлять дополнительное значение в данные Seed (или это приведет к тому, что все сломается для более ранних миграций, когда новый столбец не существует в базе данных).
- В качестве альтернативы есть ли способ предотвратить запуск метода Seed после этой миграции (и всех последующих миграций).
Спасибо
1 ответ
Entity Framework великолепен, но, чтобы иметь возможность эффективно его использовать, боюсь, у нас действительно нет другого выбора, кроме как быть внимательным, чтобы убедиться, что миграции и начальный метод синхронизированы и хорошо работают друг с другом.
Да, если вы поместите новое значение в начальное число (т.е.
new QuestionType() { Name = QuestionTypeNames.INTERVIEWER, Duplicated = true}
), это приведет к поломке систем, в которых не применена последняя миграция. Это потому, что метод семени будет искатьDuplicated
колонка но не найду.Нет, я не думаю, что есть способ сделать это, по крайней мере, не автоматически. Одним из решений является следующее: так как у вас есть доступ к
context
объект в методе seed, вы можете просто запросить базу данных, чтобы проверить, существует ли конкретная миграция. Затем вы можете обернуть конкретную сеялку дляQuestionTypes
вif
утверждение, использующее результат предыдущего запроса.