我有一个简单的网络应用程序。它由具有暂存和生产插槽的Azure Web应用程序组成。当无需考虑数据库迁移时,我可以通过以下方式轻松实现无缝更新:部署应用程序以暂存交换登台生产版位当我要处理数据库迁移时,这将变得更加棘手。现在我要做的是:部署应用程序以暂存部署准备就绪后,将更新数据库运行到Prod(无暂存数据库)交换登台生产版位这意味着我仍然可以有效地停机,因为2 + 3不会同时发生,这意味着在几秒钟内,由于“数据库模式已更改”,我的用户将遇到不完美的行为。这里最简单的解决方案是什么?我在想可能也必须启动一个临时数据库,但是随后我不得不担心复制和连接字符串管理,这会增加一些开销。 最佳答案 在将解决方案转换为连续交付模型时,我们面临着同样的困境,并且希望避免停机。您需要将EF配置为在开发环境上运行Code-First,在生产环境中运行Database-First。这样就可以将更改推到三个阶段:阶段1.数据库迁移在此阶段,您将使用EF的migrate.exe实用程序(或只是简单地编写脚本来手动编写脚本)对实时数据库运行最新的迁移。应用迁移后,您的网站在生产中仍然可以正常运行,因为什么都没发生(因为它已配置为数据库优先)。 的重要一点是,您需要确保在此阶段的迁移是可累加的,从某种意义上说,它将更改一个表或列,这将导致事件站点崩溃。它可能看起来很吓人,但是如果您的项目足够成熟,您很快就会意识到,架构的大多数更改都是完全相加的,或者可以分为两个阶段。 (请参阅第3阶段)阶段2.更新生产网站在此阶段,请进行正常的暂存->生产网站部署。阶段3。数据库迁移(第2部分)在极少数情况下,例如您已重命名数据库表或列,则需要考虑将其分为两个步骤:添加新列(在第1部分中完成)删除旧列并迁移数据(在第2部分中完成)。 附录EF Database-First仅在生产中在您的Startup.cs或Global.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/
10-12 23:16