使用空MigrationHistory表从现有生产数据库迁移实体框架

时间:2014-06-19 22:56:31

标签: c# entity-framework ef-code-first ef-migrations

我有一个下载的生产数据库,其中包含一个空的MigrationHistory表(内容被意外删除)。

我的开发环境中有一个更新的代码模型(以前没有迁移)。

换句话说,下载的生产数据库架构与开发环境代码模型之间存在不匹配 - 并且它们之间没有历史记录。

如何构建代码优先迁移(或获取SQL)以将生产数据库更新为新模型?

我根据建议here尝试了以下内容:

  1. 在我的项目中启用迁移(Enable-Migrations
  2. 添加空迁移(Add-Migration InitialCreate -IgnoreChanges
  3. 应用此迁移(Update-Database
  4. 这会导致在MigrationHistory表中添加一行。

    然而,EF似乎认为这意味着当前的代码模型与数据库模式匹配(当然,它没有)。

    如果我尝试添加新的迁移(Add-Migration UpdatedModel),则此迁移将为空,但由于代码模型和数据库不匹配,因此不应该这样做。

    如何获得反映代码模型和数据库模式之间变化的代码优先迁移(或SQL)? (如果我在没有Add-Migration InitialCreate标志的情况下尝试-IgnoreChanges,我会从头开始创建整个数据库,正确反映代码模型,但我想要进行更改。)

1 个答案:

答案 0 :(得分:0)

您所遵循的指南中的第一步清楚地表明您需要一个与数据库同步的模型。那就是它失败了。

您需要做的是:

  1. 暂时删除当前的Code First模型(即在某处备份当前模型的文件:文件系统,CVS)
  2. 从现有数据库中反向设计Code First模型
  3. 启用迁移,并创建初始迁移:Enable-Migrations
  4. 在此步骤中,您的数据库和模型将同步。还有一些步骤,你准备好了:

    1. 将模型替换为原始模型(您在上一步骤1中保留的模型)
    2. 添加新迁移Add-Migration
    3. 更新您的数据库:Update-Database
    4. Tchan!你懂了!顺便说一下,了解迁移命令的每个参数非常重要,为此,在您的程序包管理器控制台中,使用以下任何命令:

      • get-help Enable-Migrations -examples
      • get-help Enable-Migrations -detailed
      • get-help Enable-Migrations -full

      简而言之:当您启用迁移时,Code First模型和数据库必须匹配。没有其他方法可以执行此操作。这就是为什么你必须对数据库进行反向工程以获得初始同步,并从此开始工作。