当部署到生产环境时,EF代码优先迁移而不是播种数据

本文关键字:迁移 数据 生产环境 部署 代码 EF | 更新日期: 2023-09-27 18:01:33

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

add-migration SomeMigration
update-database

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

当我导航到网站时,我可以看到使用SQL Server管理工作室创建的表,但没有种子数据应用?下面是我的种子类?

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

当部署到生产环境时,EF代码优先迁移而不是播种数据

我可以从你的代码中看到,你已经决定为DbMigration。当您运行迁移和更新数据库时,它将运行seed方法。

例如,它将被称为:每次执行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/

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

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

播种绝对是一个问题,因为某些原因,这是不包括在脚本。我们只是避免在迁移中添加任何种子,而是在数据库初始化器中使用Seed()。这只会在创建数据库时运行,这对于查找表来说是完美的。当我们需要在数据启动并运行后添加或更新数据时,我们在迁移的up()方法中使用Sql()命令(这些命令是脚本化的)。

关于错误"database context has changed. "请考虑使用"代码优先迁移"——这与播种无关。这通常意味着您没有将迁移应用到已部署的数据库。当您在本地更改模型时,您需要通过脚本或其他方法更新已部署的数据库。