2014-07-15 305 views
4

EF6种子我有一个应用程序设置,现在使用EF6代码首先迁移。我在控制台中使用标准的添加迁移工作流,然后是更新数据库。我用的是MigrateDatabaseToLatestVersion初始化本地,以及在我们的开发环境。这为我和其他开发人员自动处理所有迁移。没有更新,数据库

我很不舒服,允许自动迁移发生在生产环境中,所以我运行Update-Database -script来生成一个SQL脚本,我可以在运行之前查看它。这工作得很好,我很满意这个部署过程。但是,我意识到SEED方法永远不会运行,因为Update-Database不直接在数据库上运行。

我正在寻找一个好办法让迁移配置的SEED的方法,但不运行实际迁移运行。我发现migrate.exe(http://msdn.microsoft.com/en-us/data/jj618307.aspx),看起来好像可能没问题,但我想看看有没有人知道更好的方法。

而且,可能更重要的是,我是不是荒谬的担心在生产中自动迁移,考虑多少自动化,我本来已经采用EF6使用?

谢谢!

+0

我在生产中误会了一次迁移,并且由于迁移中的错误以及我们db主机提供商的限制,这意味着所有用户都拥有root访问权限,因此我丢失了数据库。因人而异。 –

+1

我希望[这个答案](http://stackoverflow.com/a/17339310/2115584)将帮助你 – Baximilian

+0

谢谢Baximilian。这看起来像我正在寻找的答案。 – Adam

回答

2

仅供参考 - 对于那些有兴趣 - 我结束了创建调用共享的种子逻辑我自己的数据库初始化。我把所有的种子代码移动到一个静态的“种子”类的执行方法。然后我创建了一个简单的DatabaseInitializer,在我的生产web.config中使用。我仍然使用MigrateToLatestVersion作为Dev和本地的初始化工具,它的工作原理类似于魅力。

public class SeedOnlyInitializer : IDatabaseInitializer<YourContextType> { 

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

感谢Baximilian指出我在正确的方向。答案并不完全符合我的意愿,但它帮助我想出了这个问题。

-1

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

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