繁体   English   中英

数据库中已经有一个名为“__MigrationHistory”的对象

[英]There is already an object named '__MigrationHistory' in the database

当我尝试在远程数据库上执行SQLQuery (在 Visual Studio 中本地由Update-Database -Verbose -f -Script生成)时,我看到 SQL Server Management Studio 返回以下错误:

Msg 2714, Level 16, State 6, Line 1

数据库中已经有一个名为“__MigrationHistory”的对象。

如何解决这个问题?

就一个问题。 您使用的是 dbo 以外的其他架构吗?

我认为这是 EF 框架中的一个错误,它在检查 __MigrationHistory 表是否存在时不检查架构。

我能够通过使用 dbo 模式创建一个虚拟的 __MigrationHistory 表来解决这个问题,这欺骗了 EF6 生成器来“创建表”

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]) )

如果要使其自动化,则必须使用使用 dbo 架构的虚拟类创建空迁移,并首先运行该迁移以生成相关表。 然后使用不同的模式运行迁移脚本,它应该可以工作。

__MigrationHistory是一个自动生成的表,EF 使用它来跟踪它已应用于数据库的升级/补丁。 EF 完全了解该表并自行处理它。 您不应该创建/删除/更改该表。 看来你的数据库已经有那个表了。 如果 EF 或您的升级脚本试图创建这样的表,这很奇怪 您需要仔细检查所有内容并猜测/了解真正发生了什么,因为要么 EF 变得疯狂,要么您的脚本以错误的方式准备。

我在执行“Code First from an Existing Database”时看到了这种情况,其中提取的数据库已经有 __MigrationHistory 表。

它最终添加了该类型的 POCO 类。 删除类,重做迁移并再次运行。

您应该将启动项目的连接字符串更改为指向远程数据库 - 它似乎指向已经具有 __MigrationHistory 表的数据库,或者使用

update-database -script -SourceMigration $InitialDatabase

它将所有迁移脚本编写到一个文件中,并通过迁移检查迁移以查看它需要运行哪些迁移。 该脚本所做的第一件事是检查 __MigrationHistory 表是否存在,如果不存在则创建它。

可能缺少迁移设置。 按照本教程中的建议,在更新数据库之前在包管理器控制台中键入命令add-migration MigrationName对我有用

在删除数据库后,更改 web.config 中的连接字符串中的数据库名称解决了我。 这是一种有助于开发环境的解决方法。 数据库是用新实体重新创建的。

我从 Visual Studio 打开 SQL Explorer 并连接到数据库。 直接使用 SQL 删除表。 已删除的迁移文件夹。 再次进行迁移。 由于是测试数据库,删除表没有什么大问题。 如果它有数据,则需要考虑不同的解决方案。 没有其他工作。

  1. 工具 > SQL Server > 新建查询
  2. 删除表“table_name”;
  3. 解决方案资源管理器 > 右键单击​​迁移并删除
  4. 工具 > Nuget 包管理器 > 包管理器控制台
  5. 在包管理器控制台中(通常在屏幕底部打开):Add-Migration InitialCreate4
  6. 更新数据库

如果您使用带有 EF 和 .net core 的现有数据库,那么在撰写本文时,您将需要使用空的 Up/Down 方法(手动删除代码)创建初始迁移( dotnet ef database update ),因为未实现-IgnoreChanges

protected override void Up(MigrationBuilder migrationBuilder)
        {

        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
           
        }

这将阻止您的迁移尝试在代码优先场景中的第一次迁移时正常创建表。

dotnet ef database update

完成后,您将能够使用正常迁移进行更新。

请参阅: https : //docs.microsoft.com/en-us/ef/ef6/modeling/code-first/migrations/existing-database

CLI 中实体框架核心的 -IgnoreChanges 开关等效于什么?

转到迁移文件夹。 您将看到两个文件,一个是配置文件,另一个文件以一些数字开头,例如 019763632... 打开它,注释生成已创建表的代码。 然后启用自动迁移Enable-Migrations -EnableAutomaticMigrations update-database这对我Enable-Migrations -EnableAutomaticMigrations试试吧

我设法通过删除确保创建数据库的部分来解决此错误。

//Database.EnsureCreated();

如果数据库不存在,这部分应该创建数据库。

暂无
暂无

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

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