已经有一个名为'__迁移历史记录';数据库中
本文关键字:记录 数据库 历史 迁移 有一个 | 更新日期: 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删除了表。已删除迁移文件夹。再次运行迁移。由于它是测试数据库,所以删除表并没有什么大问题。如果它有数据,你需要考虑一个不同的解决方案。其他什么都不起作用。
- 工具>SQL Server>新建查询
- 删除表"table_name"
- 解决方案资源管理器>右键单击迁移和删除
- 工具>Nuget包管理器>包管理器控制台
- 在Package Manager控制台(通常在屏幕底部打开)中:添加迁移初始创建4
- 更新数据库
如果您使用的是带有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 -EnableAutomaticMigrations
update-database
这对我来说很有效,试试
我删除了确保创建数据库的部分,从而解决了这个错误。
//Database.EnsureCreated();
如果数据库不存在,那么这部分应该创建数据库。