gpt4 book ai didi

entity-framework - 通过架构更改从暂存 > 生产中无缝 EF 迁移

转载 作者:行者123 更新时间:2023-12-04 07:26:04 25 4
gpt4 key购买 nike

我有一个简单的网络应用程序。它由带有暂存和生产槽的 Azure Web 应用程序组成。当不需要考虑数据库迁移时,我可以通过以下方式轻松实现无缝更新:

  1. 将应用部署到暂存
  2. 交换暂存 <> 生产时段

当我要处理数据库迁移时,这会变得更加棘手。现在我所做的是:

  1. 将应用部署到暂存
  2. 部署准备就绪后,运行 update-database 到 Prod(无临时数据库)
  3. 交换暂存 <> 生产时段

这意味着我实际上仍然有停机时间,因为 2 + 3 不会同时发生,这意味着在几秒钟内,我的用户将体验到不完美的行为,因为“数据库架构已更改”。

这里最简单的解决方案是什么?我想我可能还必须启动临时数据库,但随后我必须担心复制和连接字符串管理,这会增加一些开销。

最佳答案

在将解决方案转向持续交付模型时,我们遇到了同样的困境,并且希望避免停机。

您需要将 EF 配置为在开发环境中运行代码优先,并在生产环境中运行数据库优先

这使得您可以分三个阶段插入您的更改:

第 1 阶段:数据库迁移

在此阶段,您将使用 EF 的 migrate.exe 实用程序(或者只是事先编写脚本)针对实时数据库运行最新的迁移。应用迁移后,您的生产环境中的网站仍然可以正常运行,因为什么也没有发生(因为它被配置为数据库优先)。

重要的一点是,您需要确保此阶段的迁移是可添加的,从某种意义上说,它会更改表格或列这将导致现场网站崩溃。这可能看起来很可怕,但如果您的项目足够成熟,您很快就会意识到模式的大多数更改要么完全是累加的,要么可以分为两个阶段。 (参见第 3 阶段)

第 2 阶段。更新生产网站

在此阶段进行正常的暂存 --> 生产网站部署。

第 3 阶段:数据库迁移(第 2 部分)

在极少数情况下,例如重命名数据库表或列,您需要考虑将其分为两个步骤:

  • 添加新列(在第 1 部分中完成)
  • 删除旧列并迁移数据(在第 2 部分中完成)。
<小时/>

附录

EF 数据库 - First 仅在生产中

在您的 Startup.csGlobal.asax.cs 中:

#if DEBUG
Database.SetInitializer(new MigrateDatabaseToLatestVersion<AppDatabase, Migrations.Migrations.Configuration>());
#else
Database.SetInitializer(new RequireDatabaseToBeUpToDate<AppDatabase, Migrations.Migrations.Configuration>());
#endif

这正如 jar 头上所说的那样:

  • 在本地:将其数据库迁移到最新迁移。
  • 生产中:确保数据库迁移不领先正在使用的模型装配。 -- 这是一项安全措施,确保即使我们不小心在数据库之前部署了 Web,它也会阻止网站启动。
<小时/>
public class RequireDatabaseToBeUpToDate<TContext, TMigrationsConfiguration> : IDatabaseInitializer<TContext>
where TContext : DbContext
where TMigrationsConfiguration : DbMigrationsConfiguration, new()
{
public void InitializeDatabase(TContext context)
{
var migrator = new DbMigrator(new TMigrationsConfiguration());
var migrations = migrator.GetPendingMigrations().ToList();
if (migrations.Any())
{
var message = "There are pending migrations that must be applied (via a script or using migrate.exe) before the application is started.\r\n" +
$"Pending migrations:\r\n{string.Join("\r\n", migrations)}";
throw new MigrationsPendingException(message);
}
}
}

针对实时数据库运行迁移

$migrate = "<path>\migrate.exe"
$migrateConfig = "<path>\migrate.exe.config"
$connectionString = <your-live-connection-string>
& $migrate <your-project-migration-assembly> /startupConfigurationFile=$migrateConfig <your-migration-configuration-type-name> /connectionString=$connectionString /connectionProviderName=System.Data.SqlClient /verbose

关于entity-framework - 通过架构更改从暂存 > 生产中无缝 EF 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38669620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com