具有实体框架迁移的条件种子

时间:2012-12-05 21:16:02

标签: entity-framework entity-framework-4.3 ef-migrations

有一段时间我一直试图找到一个解决方案,说明如何在迁移配置中使用种子方法,而不必担心下次运行种子方法时会覆盖更新的数据。

简而言之,我的理解是addorupdate,如各种教程所示,将重置每个对象的所有值,从而覆盖该对象自最初播种以来可能发生的任何更改。

在我目前的项目中,我希望能够播放一组默认的emailtemplates。将它们放入种子方法将确保它们始终存在于我的代码中。但是,我希望应用程序的用户能够根据需要编辑某些内容。因此,我可以很好地重置模板,重置种子方法运行的所有内容,因为它会删除更改。

我的解决方案是:

    protected override void Seed(Jobboard.Sandbox.Model.JobboardContext context)
    {
        Guid DefaultTemplateGuid = Guid.Parse("xxxxx");

        context.Templates.AddOrUpdate(
              t => t.Guid,
                  context.Templates.FirstOrDefault(x => x.Guid == DefaultTemplateGuid)
                  ?? new Template {
                     Guid = DefaultTemplateGuid,
                     Name = "Default Template",
                     Content = "Some Default Content"
                  }
        );
    }

总而言之,这似乎工作得很好,我的问题是,是否有人能够发现任何以这种方式做种子的问题,因为它不完全是EF团队建议使用此功能的方式,我宁愿不结束后来对此感到头疼。

非常感谢您阅读。

1 个答案:

答案 0 :(得分:0)

您可以通过不使用AddOrUpdate扩展方法来保存一些数据库。这是您的代码的简化版本。

protected override void Seed(Jobboard.Sandbox.Model.JobboardContext context)
{
    var defaultTemplateGuid = Guid.Parse("xxxxx");
    var defaultTemplate = context.Templates.SingleOrDefault(
        t => t.Guid == defaultTemplateGuid);

    if (defaultTemplate == null)
    {
        context.Templates.Add(
            new Template
                {
                    Guid = defaultTemplateGuid,
                    Name = "Default Template",
                    Content = "Some Default Content"
                });
    }
}