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