繁体   English   中英

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

[英]How to restore database EF migration tools

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

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

附加信息:由于存在未决的更改并且自动迁移被禁用,因此无法更新数据库以匹配当前模型。 将待处理的模型更改写到基于代码的迁移中,或者启用自动迁移。 将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移

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

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

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

  1. 如果您同时删除了_MigrationHistory的内容和结构,请创建一个空的_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复制到生产数据库中。

要还原所有版本的__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表(已为您还原)的所有版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM