Entity Framework: Добавить столбец требует изменения исходных данных?

Во-первых, я почти уверен, что об этом, должно быть, уже спрашивали раньше, но мне не удалось найти точный ответ через Google, поэтому, пожалуйста, потерпите меня.

Я унаследовал проект фреймворка с первым кодом, который использует миграции. Я добавил в таблицу столбец (не допускающий значения NULL), и мне нужно вставить в этот столбец значения для всех существующих записей, которые не являются значением по умолчанию:

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. «Безопасно» ли просто добавить дополнительное значение в исходные данные (или это приведет к поломке всего для более ранних миграций, когда новый столбец не существует в базе данных).
  2. В качестве альтернативы, есть ли способ предотвратить запуск метода Seed после этой миграции (и всех последующих миграций).

Спасибо


person C. Knight    schedule 22.03.2016    source источник


Ответы (1)


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

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

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

person OJ Raqueño    schedule 22.03.2016
comment
Спасибо, что подтвердили это - я не подумал о том, чтобы проверить, была ли применена миграция, звучит как работоспособный подход. Посмотрев более подробно на данные, добавленные в метод Seed, есть некоторые данные, которых в любом случае не должно быть (жестко закодированные пароли и т. Д.), Поэтому может оказаться, что лучше всего просто удалить данные из Seed. метод полностью ... - person C. Knight; 22.03.2016
comment
Дублированные будут всегда, потому что миграции применяются до запуска Seed (). - person Steve Greene; 22.03.2016