已经有一个名为'__迁移历史记录';数据库中

本文关键字:记录 数据库 历史 迁移 有一个 | 更新日期: 2023-09-27 18:24:52

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

消息2714,级别16,状态6,第1行

数据库中已存在名为'__MigrationHistory'的对象。

如何解决这个问题?

已经有一个名为'__迁移历史记录';数据库中

只是一个问题。您使用的是dbo以外的其他模式吗?

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

我只需要用dbo模式创建一个Dummy_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模式的伪类创建一个Empty Migration,并首先运行该迁移来生成相关的表。然后用不同的模式运行迁移脚本,它应该可以工作了。

__MigrationHistory是EF自动生成的表,用于跟踪它对数据库应用了哪些升级/补丁。EF完全了解该表,并自行处理。您不应该创建/删除/更改该表。你的数据库似乎已经有了那个表。如果EF或您的升级脚本试图创建这样的表,这很奇怪。你需要仔细回顾一切,猜测/了解到底发生了什么,因为要么EF疯了,要么你的剧本准备得不对。

我在执行"现有数据库的代码优先"时看到过这种情况,其中从中提取的数据库已经有__MigrationHistory表。

它最终添加了一个类型为的POCO类。删除该类,重新进行迁移,然后再次运行。

您应该更改启动项目的连接字符串以指向远程数据库(看起来它指向的是已经有__MigrationHistory表的数据库),或者使用生成完整的脚本

update-database -script -SourceMigration $InitialDatabase

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

可能缺少迁移的设置。在更新数据库之前,在Package Manager控制台中键入命令add-migration MigrationName对我来说很有效,如本教程

中所建议的那样

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

我从visualstudio打开了SQL资源管理器并连接到数据库。直接使用SQL删除了表。已删除迁移文件夹。再次运行迁移。由于它是测试数据库,所以删除表并没有什么大问题。如果它有数据,你需要考虑一个不同的解决方案。其他什么都不起作用。

  1. 工具>SQL Server>新建查询
  2. 删除表"table_name"
  3. 解决方案资源管理器>右键单击迁移和删除
  4. 工具>Nuget包管理器>包管理器控制台
  5. 在Package Manager控制台(通常在屏幕底部打开)中:添加迁移初始创建4
  6. 更新数据库

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

protected override void Up(MigrationBuilder migrationBuilder)
        {
        }
        protected override void Down(MigrationBuilder migrationBuilder)
        {
           
        }

这将防止您的迁移尝试创建表,就像在代码优先的场景中第一次迁移时一样。

运行

dotnet ef database update

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

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

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

转到迁移文件夹。你会看到两个文件,一个是配置,另一个文件以一些数字开头,比如019763632…打开它注释生成已创建表的代码。然后启用自动迁移Enable-Migrations -EnableAutomaticMigrationsupdate-database这对我来说很有效,试试

我删除了确保创建数据库的部分,从而解决了这个错误。

//Database.EnsureCreated();

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