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" - 这与播种无关。这通常意味着您尚未将迁移应用到已部署的数据库。当您在本地更改模型时,您需要通过脚本或其他方法使用迁移更新已部署的数据库。
我有一个 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" - 这与播种无关。这通常意味着您尚未将迁移应用到已部署的数据库。当您在本地更改模型时,您需要通过脚本或其他方法使用迁移更新已部署的数据库。