当部署到生产环境时,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
错误?
我可以从你的代码中看到,你已经决定为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. "请考虑使用"代码优先迁移"——这与播种无关。这通常意味着您没有将迁移应用到已部署的数据库。当您在本地更改模型时,您需要通过脚本或其他方法更新已部署的数据库。