База данных обновлений Postegres ef-core выдает ошибку 42P01: отношение __EFMigrationsHistory не существует.

Настройка

Основной веб-сайт Asp.NET 2.2 и EF Core 2.2
База данных Postgresql с несколькими схемами, одна из которых уже содержит __EFMigrationsHistory таблицу.


при попытке

Add-Migration x1 -Context YodaContext работает

но при попытке выполнить следующий оператор
Update-Database -Context YodaContext в первый раз (у меня нет таблиц в этой схеме, это первая база данных обновления) я вижу следующую ошибку.

Failed executing DbCommand (85ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT "MigrationId", "ProductVersion"
FROM "__EFMigrationsHistory"
ORDER BY "MigrationId";
Npgsql.PostgresException (0x80004005): 42P01: relation "__EFMigrationsHistory" does not exist
   at Npgsql.NpgsqlConnector.<>c__DisplayClass161_0.<<ReadMessage>g__ReadMessageLong|0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at Npgsql.NpgsqlConnector.<>c__DisplayClass161_0.<<ReadMessage>g__ReadMessageLong|0>d.MoveNext() in C:\projects\npgsql\src\Npgsql\NpgsqlConnector.cs:line 1032
--- End of stack trace from previous location where exception was thrown ---
   at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming) in C:\projects\npgsql\src\Npgsql\NpgsqlDataReader.cs:line 444
   at Npgsql.NpgsqlDataReader.NextResult() in C:\projects\npgsql\src\Npgsql\NpgsqlDataReader.cs:line 332
   at Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken) in C:\projects\npgsql\src\Npgsql\NpgsqlCommand.cs:line 1218
   at Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior) in C:\projects\npgsql\src\Npgsql\NpgsqlCommand.cs:line 1130
   at System.Data.Common.DbCommand.ExecuteReader()
   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.GetAppliedMigrations()
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_1.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
42P01: relation "__EFMigrationsHistory" does not exist

Что я сделал

  1. Я искал эту ошибку и нашел эту ошибку на github. Предлагаемое решение должно было создать таблицу вручную, что я и сделал, но это не решило проблему.

  2. Я также попытался открыть новый проект .NET 5 и установить последнюю версию поставщика Npgsql.EntityFrameworkCore.PostgreSQL v 5.0.0 для подключения к этой базе данных, и я все еще сталкиваюсь с этой проблемой.


этот вопрос не решает проблему EF Core — таблица '*.__EFMigrationsHistory' не существует


person Hakan Fıstık    schedule 17.11.2020    source источник
comment
Ваша база данных уже существует и какие таблицы в ней есть? Возможно, вы пытаетесь запустить Update-Database в базе данных, в которой уже есть таблицы, но еще нет таблицы __EFMigrationsHistory. Попробуйте выполнить это в базе данных, которой еще не существует, и это должно сработать.   -  person Shay Rojansky    schedule 22.11.2020
comment
@ShayRojansky Ваша база данных уже существует? Да, а какие у него есть таблицы? у него несколько схем, многие из них имеют __EFMigrationsHistory таблицу. Попробуйте выполнить это в базе данных, которой еще не существует,даже если это сработает, а я думаю, что сработает, это не решит мою проблема, потому что я работаю на очень крупном предприятии, которое предоставляет мне базу данных   -  person Hakan Fıstık    schedule 23.11.2020
comment
похоже, вы пытаетесь выполнить настройку с несколькими арендаторами, где каждая схема имеет свою собственную таблицу __EFMigrationsHistory и каким-то образом должна мигрировать независимо от других - это не поддерживается. Предполагается, что EF будет управлять всей базой данных, включая все схемы, с помощью одного набора миграции, отслеживаемого одной таблицей __EFMigrationsHistory.   -  person Shay Rojansky    schedule 25.11.2020
comment
@ShayRojansky действительно спасибо за ваше время, проблема решена со стороны предприятия, они удалили эту схему и создали ее снова, и, возможно, они сделали некоторые другие вещи (о которых я понятия не имею) после того, как оператор update-database работал отлично . Я не делал ничего особенного со своей стороны, я опубликую это как решение моей проблемы.   -  person Hakan Fıstık    schedule 25.11.2020


Ответы (2)


У меня тоже такая же проблема, но у меня нет прав на удаление схемы и ее повторное создание в моей компании. Я решил проблему другим способом:

  1. Я запускаю команду для выполнения миграции. Add-Migration InitialIdentityUser -Context IdentityUserDbContext
  2. После этого я использую хитрую команду Script-Migration -from 0. Эта команда генерирует кучу запросов sql для создания схемы и таблиц.
  3. Я использую довольно классный инструмент - flyway для своих миграций https://flywaydb.org/
  4. Выполните команду baseline с помощью инструмента flyway.
flyway baseline -locations=filesystem:. -url=... -user=... -password=... -baselineVersion="001" -schemas=...
  1. Наконец, выполните команду migrate для переноса всех таблиц sql.
flyway migrate -locations=filesystem:. -url=... -user=... -password=... -schemas=...
person DarkSideMoon    schedule 20.12.2020

Я столкнулся с этой проблемой, работая с очень большим предприятием, поэтому решение было применено самим предприятием, они удалили схему и создали ее снова (как мне сказали), может быть, они сделали что-то еще, я не знаю.

После этого все пошло хорошо, и инструкция Update-Database сработала отлично.

person Hakan Fıstık    schedule 25.11.2020