Entity Framework: 添加列需要更改种子数据?

Entity Framework: Add column requires altering of Seed data?

首先,我很确定之前一定有人问过这个问题,但无法通过谷歌搜索找到确切的答案,所以请耐心等待。

我继承了一个使用迁移的代码优先 entity framework 项目。我在 table 中添加了一个(不可为空的)列,我需要将所有现有条目的值插入此列 - 这不是默认值:

public override void Up()
{
    AddColumn("dbo.QuestionType", "Duplicated", c => c.Boolean(nullable: false, defaultValue: false));
    Sql("UPDATE dbo.QuestionType SET Duplicated = 1");
}

然而最初有一些种子数据添加到这个table:

context.QuestionTypes.AddOrUpdate(
                e => e.Name,
                new QuestionType() { Name = QuestionTypeNames.INTERVIEWER});

这意味着在调用Seed方法(每次迁移后调用)中更新语句立即被数据覆盖。

我的问题是:

  1. 是否 'safe' 只是将额外的值添加到种子数据中(或者这会导致数据库中不存在新列的早期迁移的一切都中断)。
  2. 或者,在这次迁移(以及所有后续迁移)之后,是否有任何方法可以防止 运行 使用 Seed 方法。

谢谢

Entity Framework 很棒,但是要有效地使用它,恐怕我们真的别无选择,只能努力确保迁移和种子方法同步并正常工作彼此很好

  1. 是的,如果您将新值放入种子中(即 new QuestionType() { Name = QuestionTypeNames.INTERVIEWER, Duplicated = true}),这将导致未应用最新迁移的系统崩溃。这是因为种子方法将查找 Duplicated 列但不会找到它。

  2. 不,我认为没有办法做到这一点,至少不是自动的。一种解决方案是:由于您可以访问 seed 方法中的 context 对象,您可以查询数据库以检查特定迁移是否已经存在。然后,您可以利用先前查询的结果,将 QuestionTypes 的特定播种机包装在 if 语句中。