EF Core无法使用迁移功能:"42P07:关系“AspNetRoles”已经存在"

9

我遇到了一个奇怪的问题,找不到解决方法。

使用的技术栈是:NET Core 2、EF、PostgreSQL。 我使用 .NET Core Identity 并继承基本用户模型 User : IdentityUser 来添加额外的字段。

在我创建第一个迁移后,删除整个数据库并尝试 dotnet ef database update 时,总是会出现错误:42P07: relation "AspNetRoles" already exists

即使出现此错误,数据库和表也会被创建,但这使得迁移变得无用,因为它不保存已应用的迁移,所以我无法使用以下更改更新数据库...

fail: Microsoft.EntityFrameworkCore.Database.Command[200102] Failed executing DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] CREATE TABLE "AspNetRoles" ( "Id" text NOT NULL, "ConcurrencyStamp" text NULL, "Name" varchar(256) NULL, "NormalizedName" varchar(256) NULL, CONSTRAINT "PK_AspNetRoles" PRIMARY KEY ("Id") ); Npgsql.PostgresException (0x80004005): 42P07: relation "AspNetRoles" already exists at Npgsql.NpgsqlConnector.d__148.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult() at System.Runtime.CompilerServices.ValueTaskAwaiter1.GetResult()
at Npgsql.NpgsqlConnector.d__147.MoveNext()


你在迁移创建后更改了一些内容吗?那个操作可能会触发类似的错误。 - George Poliovei
没有。什么都没有。我已经尝试过多次删除迁移并重新创建它们。 - Marek Urbanowicz
3个回答

13

原因非常简单。我在Startup.cs中调用了EnsureCreated,这与迁移方式冲突。

值得庆幸的是,EF Core的所有者在GitHub上为我澄清了这一点。

因此,总结一下 - 如果您想使用迁移,则不能使用EnsureCreated


2

我正在做一些非常愚蠢的事情!我从另一个微服务中复制了连接字符串,但连接字符串中的数据库是错误的 - 该数据库已经拥有了报错信息所抱怨的表格!块复制再次出现问题!


我讨厌当我的代码按照我的指令去执行而不是按照我的意愿去执行... - Stanley

0

我曾经遇到同样的问题,解决方法是删除整个数据库(因为里面没有重要的信息),然后用新名称生成数据库,再添加迁移并更新数据库。


这可能是一个解决方案,但没有人想丢失数据。 - heaxyh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接