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 (вызывается после каждой миграции).

Мои вопросы:

  1. Безопасно ли просто добавлять дополнительное значение в данные Seed (или это приведет к тому, что все сломается для более ранних миграций, когда новый столбец не существует в базе данных).
  2. В качестве альтернативы есть ли способ предотвратить запуск метода Seed после этой миграции (и всех последующих миграций).

Спасибо

1 ответ

Решение

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

  1. Да, если вы поместите новое значение в начальное число (т.е. new QuestionType() { Name = QuestionTypeNames.INTERVIEWER, Duplicated = true}), это приведет к поломке систем, в которых не применена последняя миграция. Это потому, что метод семени будет искать Duplicated колонка но не найду.

  2. Нет, я не думаю, что есть способ сделать это, по крайней мере, не автоматически. Одним из решений является следующее: так как у вас есть доступ к context объект в методе seed, вы можете просто запросить базу данных, чтобы проверить, существует ли конкретная миграция. Затем вы можете обернуть конкретную сеялку для QuestionTypes в if утверждение, использующее результат предыдущего запроса.

Другие вопросы по тегам