Entity framework 带有实体框架迁移的条件种子

Entity framework 带有实体框架迁移的条件种子,entity-framework,entity-framework-4.3,entity-framework-migrations,Entity Framework,Entity Framework 4.3,Entity Framework Migrations,一段时间以来,我一直在试图找到一种解决方案,即如何在迁移配置中使用seed方法,而不用担心下次运行seed方法时更新的数据会被覆盖 简言之,我的理解是,addorupdate(如各种教程中所示)将重置每个对象的所有值,从而覆盖该对象自最初设定种子以来可能发生的任何更改 在我当前的项目中,我希望能够为一组默认的emailtemplates种子。将它们放入seed方法将确保它们始终存在于我的代码中。但是,我希望应用程序的用户能够编辑一些他们认为合适的内容。所以我不能很好地让模板重置seed方法运行的

一段时间以来,我一直在试图找到一种解决方案,即如何在迁移配置中使用seed方法,而不用担心下次运行seed方法时更新的数据会被覆盖

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

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

我的解决办法是:

    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"
                  }
        );
    }
总而言之,这一切似乎都很好,我的问题是,如果有人能发现任何问题,这样做的种子,因为它不完全是英孚团队建议使用此功能的方式,我宁愿不结束头痛过了这一点


非常感谢阅读。

不使用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"
                });
    }
}