EF迁移工具如何恢复数据库

How to restore database EF migration tools

我弄了个数据库,不小心把__MigrationHistorytable给删了。 现在程序抛出错误,我不能丢失所有数据。 有没有办法恢复我删除的table? 我会丢失所有数据库吗?

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

Additional information: Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration

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

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

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

如果您想保留您的迁移历史记录

  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. 取消注释您在迁移代码文件中注释的内容,以便在您将部署到新数据库时创建数据库模型

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

update-database -script

这将生成 sql 脚本来删除和创建 tables,过程包括迁移 table 在上面的脚本中,删除与所有其他 table 过程相关的所有 sql 命令。 仅保留 sql 与 __MigrationHistory Table.

相关的命令

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

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 服务器中的此脚本和 __MigrationHistory Table 将创建(为您恢复)所有版本。