2015-04-30 66 views
1

我得到了一个数据库,并且意外地删除了__MigrationHistory表。 现在程序抛出错误,我不能丢失所有的数据。 有没有办法恢复我删除的表? 我会丢失我所有的数据库吗?如何恢复数据库EF迁移工具

我手动添加了__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

+0

你能赶上它抛出错误,并发布它,以便我们可能知道它是什么? – Claies

+0

如果您正在尝试执行新的迁移,或者每次启动时自动迁移数据库,则“__MigrationHistory”表应该只是一个问题。无论哪种方式,这个错误都会告诉我们需要改变什么。 – Claies

+0

它试图重新创建所有的数据库,它说它不能创建表 –

回答

5

可以“重置”你的迁移的状态,您的项目。实质上,您将创建一个迁移状态,其中实体框架认为数据库的当前状态是“第一”迁移。但请注意,这会限制您使用较早的迁移状态回滚到以前版本的应用程序的能力。

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

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

2

如果你想保持你的迁移历史

  1. 如果同时删除的内容和_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. 评论向上的内容为空_MigrationHistory ()方法
  2. 运行update-database命令:它将填充__MigrationHistory不尝试做别的
  3. 取消注释您在迁移代码文件注释,以创建数据库模型什么的时候,你会一个新的数据库上部署