【问题标题】:How to restore database EF migration tools如何还原数据库 EF 迁移工具
【发布时间】:2015-07-10 18:08:54
【问题描述】:

我有一个数据库,不小心删除了 __MigrationHistory 表。 现在程序抛出错误,我不能丢失所有的数据。 反正有没有恢复我删除的表? 我会丢失所有数据库吗?

我手动添加了 __MigrationHistory,现在这是错误:

附加信息:无法更新数据库以匹配当前 模型,因为有待处理的更改并且自动迁移是 禁用。要么将挂起的模型更改写入基于代码的 迁移或启用自动迁移。放 DbMigrationsConfiguration.AutomaticMigrationsEnabled 为 true 以启用 自动迁移

【问题讨论】:

  • 你能捕捉到它抛出的错误,并发布它以便我们知道它是什么吗?
  • __MigrationHistory 表只有在您尝试进行新迁移或每次启动时自动迁移数据库时才会出现问题。无论哪种方式,错误都会告诉我们需要更改的内容。
  • 它试图重新创建所有数据库,它说它不能创建表
  • 我手动添加了 __MigrationHistory,现在出现了错误:附加信息:无法更新数据库以匹配当前模型,因为有待处理的更改并且自动迁移被禁用。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。
  • 您是否尝试简单地删除您的迁移和数据库...在控制台中输入:add-migration init update-databse

标签: c# entity-framework entity-framework-migrations


【解决方案1】:

您可以“重置”项目中的迁移状态。您实际上将创建一个迁移状态,其中 Entity Framework 认为您的数据库的当前状态是“第一次”迁移。但是请注意,这将限制您回滚到具有较早迁移状态的应用程序的先前版本的能力。

  1. 从项目的迁移文件夹中删除现有迁移。
  2. 删除数据库中的 __MigrationHistory 表(已完成)。
  3. 在包管理器控制台中运行以下命令:add-migration Reset。因为迁移文件夹不包含任何以前的迁移,Reset 迁移将是模型当前状态的完整脚本。 重要验证此Up 方法是否与当前数据库表状态完全匹配。
  4. Reset 迁移中,注释掉Up 方法中的所有内容。我们不想运行Up 方法,因为数据库应该已经匹配了。
  5. 运行update-database 命令。这将创建一个新的__MigrationHistory 表并在表中创建一个新行,表明数据库正在匹配这个Reset 迁移步骤。但是,它不会对数据库进行任何更改,因为 Up 方法是空的。
  6. (可选) 移除Reset 迁移中Up 方法周围的cmets,以便可以将新数据库编写到这一点。

【讨论】:

    【解决方案2】:

    将您的脚本指向另一个空数据库。运行所有迁移。将表和数据从 __MigrationHistory 复制到您的生产数据库中。

    【讨论】:

      【解决方案3】:

      如果您想维护您的迁移历史记录

      1. 如果您同时删除了 _MigrationHistory 的内容和结构,请使用
      2. 创建一个空的 _MigrationHistory
      CREATE TABLE [dbo].[__MigrationHistory] (
          [MigrationId]    NVARCHAR (150)  NOT NULL,
          [ContextKey]     NVARCHAR (300)  NOT NULL,
          [Model]          VARBINARY (MAX) NOT NULL,
          [ProductVersion] NVARCHAR (32)   NOT NULL,
          CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY CLUSTERED ([MigrationId] ASC, [ContextKey] ASC)
      );
      
      1. 注释所有迁移代码文件的 Up() 方法的内容
      2. 运行update-database 命令:它将重新填充__MigrationHistory 而不会尝试执行任何其他操作
      3. 取消注释您在迁移代码文件中注释的内容,以便在您将在新数据库上部署时创建 db 模型

      【讨论】:

        【解决方案4】:

        要使用所有版本(从迁移文件夹)恢复 __MigrationHistory 表,请执行以下步骤

        update-database -script
        

        这将产生sql脚本来删除和创建表,程序包括迁移表 在上述脚本中,删除所有与所有其他表、程序相关的所有 sql 命令。 只保留与 __MigrationHistory 表相关的 sql 命令。

        删除所有与迁移表无关的sql命令后,包含迁移表的创建和一些插入语句。好像

        CREATE TABLE [dbo].[__MigrationHistory] (
        [MigrationId] [nvarchar](150) NOT NULL,
        [ContextKey] [nvarchar](300) NOT NULL,
        [Model] [varbinary](max) NOT NULL,
        [ProductVersion] [nvarchar](32) NOT NULL,
        CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY ([MigrationId], [ContextKey]))
        

        现在在您的 sql server 中运行此脚本,将创建(为您恢复)所有版本的 __MigrationHistory 表。

        【讨论】:

          猜你喜欢
          • 2018-06-02
          • 2014-08-05
          • 2015-06-30
          • 1970-01-01
          • 2021-11-06
          • 2010-10-08
          • 1970-01-01
          • 2018-06-19
          • 2019-08-03
          相关资源
          最近更新 更多