没有更新数据库的EF6种子

时间:2014-07-15 18:35:10

标签: c# entity-framework deployment ef-migrations

我现在有一个应用程序设置使用EF6 Code-First Migrations。我使用Add-Migration的标准工作流程,然后在Console中使用Update-Database。我在本地以及在我们的开发环境中使用 MigrateDatabaseToLatestVersion 初始化程序。这将自动为我和其他开发人员处理所有迁移。

我对允许在生产中进行自动迁移感到不舒服,所以我运行了 Update-Database -script 来生成一个我可以在运行之前查看的SQL脚本。这非常有效,我对这个部署过程很好。但是,我意识到SEED方法永远不会运行,因为Update-Database不能直接在数据库上运行。

我正在寻找一种让迁移配置上的SEED方法在不运行实际迁移的情况下运行的好方法。我发现migrate.exe(http://msdn.microsoft.com/en-us/data/jj618307.aspx)似乎可以正常工作,但我想知道是否有人知道更好的方法。

另外,也许更重要的是,考虑到我使用EF6已经固有地使用了多少自动化,我是否有可能担心生产中的自动迁移?

谢谢!

2 个答案:

答案 0 :(得分:3)

仅供参考 - 对于那些感兴趣的人 - 我最终创建了自己的数据库初始化程序,它调用共享种子逻辑。我将所有种子代码移动到一个静态的种子"类'执行方法。然后我创建了一个简单的DatabaseInitializer,我在生产web.config中使用它。我仍然使用MigrateToLatestVersion作为我在Dev和本地的初始化程序,它就像一个魅力。

public class SeedOnlyInitializer : IDatabaseInitializer<YourContextType>  {

    public void InitializeDatabase(YourContextType context)
    {
        Seed.Execute(context);
        context.SaveChanges();
    } 
}

感谢Baximilian指出我正确的方向。答案并没有完全符合我的要求,但它帮助我想出了这个。

答案 1 :(得分:-1)

以下是我刚刚成功使用的工作流程:

  1. update-database -script(正如亚当最初所做的那样)
  2. 审核然后运行SQL脚本(正如Adam最初所做的那样)
  3. 再次运行update-database(此次故意省略-script标志)。只要您在上一步中的审核不涉及对SQL脚本的任何编辑,那么此步骤将不会执行任何其他迁移,并且还将运行Configuration::Seed()方法。