实体框架:添加列需要更改种子数据



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

我继承了一个使用迁移的代码优先实体框架项目。我已经在表中添加了一个(不可为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方法在此次迁移(以及所有后续迁移)后运行

感谢

Entity Framework很棒,但为了能够有效地使用它,恐怕我们别无选择,只能努力确保迁移和种子方法同步并相互良好地工作。

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

  2. 不,我不认为有办法做到这一点,至少不能自动做到。一种解决方案是:由于您可以访问种子方法中的context对象,因此您只需查询数据库即可检查特定迁移是否已经存在。然后,您可以利用前面查询的结果,将QuestionTypes的特定种子程序封装在if语句中。

最新更新