【问题标题】:Entity Framework: Add column requires altering of Seed data?实体框架:添加列需要更改种子数据?
【发布时间】:2016-07-09 05:19:57
【问题描述】:

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

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

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 方法在此迁移(以及所有后续迁移)之后运行。

谢谢

【问题讨论】:

    标签: c# entity-framework entity-framework-migrations seeding


    【解决方案1】:

    Entity Framework 很棒,但要能够有效地使用它,恐怕我们真的别无选择,只能努力确保迁移和种子方法同步并相互配合。

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

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

    【讨论】:

    • 感谢您确认这一点 - 我没有想过检查是否已应用迁移,这听起来像是一种可行的方法。更详细地查看了 Seed 方法中添加的数据后,有些数据无论如何都不应该存在(硬编码密码等),所以我最好的选择就是从 Seed 中删除数据方法完全...
    • 重复将始终存在,因为迁移是在运行 Seed() 之前应用的。
    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    相关资源
    最近更新 更多