部署到生产时EF代码优先迁移不播种数据

时间:2016-08-09 11:58:19

标签: c# asp.net-mvc entity-framework ef-migrations

我设置了一个MVC 5应用程序,其中包含代码优先迁移。在我的本地机器上,我能够运行以下命令并更新数据库:

add-migration SomeMigration
update-database

我已使用文件系统选项通过VS部署我的应用程序,因为它已部署到本地服务器。部署成功发布 - 没有错误。

当我导航到网站时,我可以看到使用SQL Server Managment Studio创建表格,但是没有应用种子数据?以下是我的种子课?

  namespace MyApp.Migrations
  {

     internal sealed class Configuration :   
     DbMigrationsConfiguration<ApplicationDbContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
            MigrationsDirectory = @"Persistence\Migrations";
        }

        protected override void Seed(ApplicationDbContext context)
        {
            // Seed stuff

        }

    }
}

如何应用种子数据?当我在本地计算机上更改模型并重新部署时,我得到database context has changed. Please consider using code first migration错误?

2 个答案:

答案 0 :(得分:2)

我可以从您的代码中看到您已决定使用DbMigration。无论何时运行迁移并更新数据库,它都将运行种子方法。

例如它将被调用: 每次执行Nuget中的Update-Database命令时。

或者,它也可以从代码中调用:

  Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration());
  ...
  ...
  dbContext.Database.Initialize(true);

或使用DbMigrator:

 DbMigrator migrator = new DbMigrator(new Configuration());
 migrator.Update();

有一件事你必须知道,Seed方法将被称为X次,其中X是数据库迁移的排名/级别。

更多信息:https://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/

!!您必须设置数据库初始化程序!!

答案 1 :(得分:0)

您当然可以将连接字符串更改为指向PROD并运行迁移,或者可以实现代码以在部署时运行迁移。在某些可接受的环境中,但我们的DBA永远不会允许这样做 - 它们需要我们提供的经过测试的脚本。我们已经为我们的流程执行了与this类似的操作。

播种肯定是一个问题,因为某些原因这不包括在脚本中。我们只是避免在迁移中添加任何种子,而是使用数据库初始化程序中的Seed()。这仅在创建数据库时运行,该数据库非常适合查找表。当我们需要在启动和运行后添加或更新数据时,我们在迁移的Up()方法中使用Sql()命令(这些命令可以编写脚本)。

关于错误&#34;数据库上下文已更改。请考虑使用代码首次迁移&#34; - 这与播种无关。这通常意味着您尚未将迁移应用于已部署的数据库。在本地更改模型时,需要通过脚本或其他方法进行迁移来更新已部署的数据库。

相关问题