Migration does not work with custom default schema

Offen
#3,359 2 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
35/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Veraltet
Tech-Stack
csharp, postgresql
Bereich
databases

Rechercherichtung

Start with src/EFCore.PG/Migrations/Internal/NpgsqlHistoryRepository.cs, especially the schema fallback identified in the issue, and trace how the history table is located when no schema is configured. Reproduce the steps using PostgreSQL with a changed search_path and EF migrations. Done means applying a subsequent migration no longer fails because the history table is incorrectly treated as already existing.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Step:

  1. Create new db with default schema 'public'. Then apply some EF migrations. Table __EFMIgrationsHistory must be created
  2. Customize search_path in the db
    ALTER ROLE ALL SET search_path TO 'custom'
    Do not specify search path in connection string.
    3, Create new migration and apply it

There is such exception.

Unhandled exception. Npgsql.PostgresException (0x80004005): 42P07: relation "__EFMigrationsHistory" already exists
   at Npgsql.Internal.NpgsqlConnector.ReadMessageLong(Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage)
   at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource<TResult>.GetResult(Int16 token)
   at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken)
   at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteReader(Boolean async, CommandBehavior behavior, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteReader(Boolean async, CommandBehavior behavior, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteNonQuery(Boolean async, CancellationToken cancellationToken)
   at [Microsoft.EntityFrameworkCore.Storage](http://microsoft.entityframeworkcore.storage/).RelationalCommand.ExecuteNonQueryAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
   at [Microsoft.EntityFrameworkCore.Storage](http://microsoft.entityframeworkcore.storage/).RelationalCommand.ExecuteNonQueryAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
   at [Microsoft.EntityFrameworkCore.Storage](http://microsoft.entityframeworkcore.storage/).RelationalCommand.ExecuteNonQueryAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.MigrateAsync(String targetMigration, CancellationToken cancellationToken)
   at Npgsql.EntityFrameworkCore.PostgreSQL.Migrations.Internal.NpgsqlMigrator.MigrateAsync(String targetMigration, CancellationToken cancellationToken)

It's because repository falls back in schema 'public':

https://github.com/npgsql/efcore.pg/blob/18d07c54eacaffa5bf8128d47eecdb5255d86376/src/EFCore.PG/Migrations/Internal/NpgsqlHistoryRepository.cs#L28-L44

In my project I've by-passed this behavior by searching with schema only when TableSchema is specified, there is no fallback in public. If schema is not specified, searchin is performed only with table name

Vorherrschende Sprache
C#
Sterne
1.8k
Forks
268
Ø Merge
2 Std. 35 Min.
Gemergte PRs (30 T.)
136

Entwicklungsumgebung

Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus npgsql/efcore.pg

Alle Issues in npgsql/efcore.pg

Ähnliche Issues

Weitere Issues zu C#

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.