【问题标题】:Entity Framework implement Code first Migrations and prevent data loss实体框架实现代码优先迁移并防止数据丢失
【发布时间】:2018-12-19 08:07:11
【问题描述】:

如果我想将迁移添加到项目并注意项目,我想知道什么是最好的指南以及需要考虑的事项:

  • 已上线(开发/登台/生产环境)
  • 实时版本的模型已更改,某些字段/表已更改 删除/添加
  • 由 Azure 应用服务托管(发布设置)
  • 是一个使用代码优先的实体框架 6 的 MVC 项目

我知道the basics of adding/using migrations,仅此而已。 我想知道如何实现对我的解决方案的迁移,发布新项目(更改模型)不会丢失任何数据

这可能吗?谁能建议我看一下对这种设置有很好解释的东西?

编辑 我正在开发中对此进行测试,但如果不重新创建数据库就无法使其工作,因此会丢失现有数据...

我的配置文件:

public Configuration()
{
    AutomaticMigrationsEnabled = true; // tried false as well
    ContextKey = "ContractCare.Models.ApplicationDbContext";
    AutomaticMigrationDataLossAllowed = false;
}

亲切的问候

【问题讨论】:

  • “某些字段/表格被删除/添加” - 您需要更好地解释这一点。在 Code First 中,数据库是根据您的代码模型创建的。当它们发生变化时,可以使用迁移来更新数据库。因此,通常在将迁移添加到现有项目时,您将创建一个捕获当前状态的初始迁移。随后的迁移将使用增量更改更新数据库。如果 staging 和 prod 与此初始快照不同,您将需要手动获取它们以匹配 DEV 基线。
  • 我有一个基于模型的现有数据库,该模型与现在不同,并且该数据库中有数据。当时我没有启用迁移。现在我想利用迁移,但具有与具有数据的模型不同的模型,其中某些属性和类不再存在或已添加属性和类(类是 DbSet 的)。我很难找到一种方法将我的模型的这个较新版本部署/发布到应用服务,但保留已经存在于数据库中的数据。
  • 运行迁移不会删除数据。如果您删除一列,那么是的,数据将会丢失。我们不在 PROD 中运行迁移。正是出于这个原因,我们从迁移中生成脚本。
  • @Sentry 我们的 DBA 不允许直接迁移到 PROD。有一些区别 :) 见 herehere
  • @SteveGreene 没错,直接从应用程序迁移需要正确的权限。我想您提供的两个链接也可能是 OP 正在寻找的答案

标签: model-view-controller entity-framework-6 entity-framework-migrations data-loss


【解决方案1】:

向您的 DEV 环境添加一个空的快照迁移。这将捕获该模型的当前状态:

enable-migrations
Add-Migration InitialBaseline –IgnoreChanges  // Tells EF not generate Up() code of existing objects
update-database

现在可以通过更改连接字符串并重新运行或通过生成可在这些服务器上运行的脚本update-database -Script,将 DEV 中的所有后续更改部署到其他环境。

在此之前,您必须使用已有的流程将其他环境“赶上”到 DEV 状态。然后将 InitialBaseline 迁移应用到这些环境。

接下来,您可以将 DEV 迁移应用到 UAT、STG 并最终应用到 PROD。由于很多迁移往往发生在 DEV 中,因此您可以按照 Chris 的解释 here 将它们汇总到一个迁移中。

【讨论】:

  • 感谢您快速详细的解释。我将在明天或下周尝试实施这一点,并将返回结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多