首先,我很确定这一定是以前问过的,但通过谷歌搜索无法找到确切的答案,所以请耐心等待。
我继承了一个使用迁移的代码优先实体框架项目。我已经在表中添加了一个(不可为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方法的调用(在每次迁移后调用)中的数据覆盖。
我的问题是:
- 简单地将额外的值添加到种子数据中是否"安全"(或者这会导致数据库中不存在新列的早期迁移中的所有内容都中断)
- 或者,是否有任何方法可以阻止Seed方法在此次迁移(以及所有后续迁移)后运行
感谢
Entity Framework很棒,但为了能够有效地使用它,恐怕我们别无选择,只能努力确保迁移和种子方法同步并相互良好地工作。
-
是的,如果在种子中放入新值(即
new QuestionType() { Name = QuestionTypeNames.INTERVIEWER, Duplicated = true}
),这将导致没有应用最新迁移的系统崩溃。这是因为种子方法将查找Duplicated
列,但找不到它 -
不,我不认为有办法做到这一点,至少不能自动做到。一种解决方案是:由于您可以访问种子方法中的
context
对象,因此您只需查询数据库即可检查特定迁移是否已经存在。然后,您可以利用前面查询的结果,将QuestionTypes
的特定种子程序封装在if
语句中。