如何还原数据库EF迁移工具

时间:2015-04-30 21:17:43

标签: c# entity-framework ef-migrations

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

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

  

其他信息:无法更新数据库以匹配当前   模型,因为有待更改和自动迁移   禁用。将挂起的模型更改写入基于代码的更改   迁移或启用自动迁移。组   DbMigrationsConfiguration.AutomaticMigrationsEnabled为true以启用   自动迁移

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

要还原所有版本的__MigrationHistory表(从migrations文件夹中),请执行以下步骤

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服务器中运行此脚本,并将创建(为您恢复)__ MigrationHistory表的所有版本。