42P07:更新 Postgre Entity Framework Core 数据库时出错

Posted

技术标签:

【中文标题】42P07:更新 Postgre Entity Framework Core 数据库时出错【英文标题】:42P07: Error while updating Postgre Entity Framework Core database 【发布时间】:2021-06-30 13:17:56 【问题描述】:

我正在尝试使用 EntityFramework 迁移更新数据库,但此错误崩溃。我开始查看他们在这个问题上写的东西,但到处都是相同的东西,即不要在初创公司中使用 EnsureCreated ,仅此而已。我在创业公司没有类似的东西,这是创业公司的代码:

services.AddDbContext<ApplicationDbContext>();

            services.AddIdentity<IdentityUserModel, IdentityRole>(
                options => options.SignIn.RequireConfirmedAccount = false
                )
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();

当然,添加授权、添加提供程序等等。但是一旦我尝试开始迁移,错误就会出现在下面。

谁遇到过这个问题或知道如何解决,请告诉我。

非常感谢您的回答!

fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
      Failed executing DbCommand (7ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      CREATE TABLE "AspNetRoles" (
          "Id" text NOT NULL,
          "Name" character varying(256) NULL,
          "NormalizedName" character varying(256) NULL,
          "ConcurrencyStamp" text NULL,
          CONSTRAINT "PK_AspNetRoles" PRIMARY KEY ("Id")
      );
Failed executing DbCommand (7ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE "AspNetRoles" (
    "Id" text NOT NULL,
    "Name" character varying(256) NULL,
    "NormalizedName" character varying(256) NULL,
    "ConcurrencyStamp" text NULL,
    CONSTRAINT "PK_AspNetRoles" PRIMARY KEY ("Id")
);
Npgsql.PostgresException (0x80004005): 42P07: отношение "AspNetRoles" уже существует
   at Npgsql.NpgsqlConnector.<ReadMessage>g__ReadMessageLong|194_0(NpgsqlConnector connector, Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage)
   at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken)
   at Npgsql.NpgsqlDataReader.NextResult()
   at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteNonQuery(Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteNonQuery()
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String connectionString, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String connectionString, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
  Exception data:
    Severity: ОШИБКА
    SqlState: 42P07
    MessageText: отношение "AspNetRoles" уже существует
    File: d:\pginstaller.auto\postgres.windows-x64\src\backend\catalog\heap.c
    Line: 1094
    Routine: heap_create_with_catalog
42P07: отношение "AspNetRoles" уже существует

【问题讨论】:

【参考方案1】:

这个错误似乎是 Postgres 中的“重复关系”。这意味着您可能正在尝试重新创建一个已经存在的数据库表。您应该仔细检查您的迁移 - 可能由于某种原因它正在尝试重新创建一个已经存在的数据库。

另一个原因是您的迁移和数据库之间存在某种不同步 - 例如,可能是其他人手动创建了表?

【讨论】:

以上是关于42P07:更新 Postgre Entity Framework Core 数据库时出错的主要内容,如果未能解决你的问题,请参考以下文章

谁知道openlayers+geoserver +postgre部署的地图数据能不能点击放大缩小是不让地图数据重新访问posrtgre数

entity.Student@150f3932, entity.Student@1a740c6b 没有实体中的数据

Java SE 上的 JPA:对象:entity.Customer@5e80188f 不是已知的实体类型

请教entity framework中数据更新的问题

Core Data Objective C更新Entity的内容

在spring data jpa中通过@Query更新Entity内部的关联对象