EF Code First 迁移在部署到生产环境时不播种数据

EF Code First Migrations Not Seeding Data When Deployed To Production

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

add-migration SomeMigration
update-database

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

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

  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 错误?

从您的代码中可以看出,您已决定使用 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 是数据库迁移的 ranking/level。

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

!!你必须设置数据库初始化器!!

您当然可以更改您的连接字符串以指向 PROD 和 运行 您的迁移,或者您可以在部署时实现代码以 运行 迁移。在某些环境中,这可能是可以接受的,但我们的 DBA 永远不会允许这样做——他们需要我们提供给他们的经过测试的脚本。对于我们的流程,我们遵循了类似于 this 的内容。

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

关于错误 "database context has changed. Please consider using code first migration" - 这与播种无关。这通常意味着您尚未将迁移应用到已部署的数据库。当您在本地更改模型时,您需要通过脚本或其他方法使用迁移更新已部署的数据库。