Как исправить ошибки базы данных EF Core после расширения IdentityUser в ASP. NET Core 3.1? - PullRequest
0 голосов
/ 16 апреля 2020

Я создал веб-приложение в ASP. NET Core 3.1, также используя Entity Framework Core 3.1, и сейчас пытаюсь опубликовать sh его до Azure. Однако в момент разработки, когда я расширил встроенный класс IdentityUser с помощью пользовательского класса ApplicationUser, мои миграции EF перестали публиковаться в базе данных. Миграции были успешно созданы, но команда update-database всегда терпела неудачу.

Поскольку я не мог понять сообщения об ошибках, я просто вручную обновил таблицы базы данных на основе информации, содержащейся в каждом из моих последующих файлов миграции , Это работало нормально, пока еще развивалось, но теперь, когда я хочу опубликовать sh приложение на Azure, те же ошибки не позволяют приложению вообще размещаться на Azure.

В основном когда Azure пытается создать базу данных, те же самые ошибки, с которыми я столкнулся во время разработки, препятствуют успешному созданию базы данных. И поскольку я использовал обходной путь вручную во время разработки, я не знаю, как теперь исправить ошибки при попытке опубликовать sh приложение на Azure.

Ниже приведено сообщение об ошибке, которое я получаю при попытке publi sh до Azure:

System.AggregateException: произошла одна или несколько ошибок. ---> System.Exception: сборка не удалась. Проверьте окно вывода для более подробной информации. --- Конец внутренней трассировки стека исключений --- в System.Threading.Tasks.Task.ThrowIfExceptional (Boolean includeTaskCanceledExceptions) в System.Threading.Tasks.Task.Wait (Int32 миллисекундTimeout, CancellationToken cancellationToken) в Microsoft.WebTools.ubli sh .PublishService.VsWebProjectPubli sh. <> C__DisplayClass43_0.b__3 () в System.Threading.Tasks.Task`1.InnerInvoke () в System.Threading.Tasks.Task.Execute () --- Трассировка конца стека из предыдущего места, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача задачи) в Microsoft.Publi * 1049M. ProfileSelectorViewModel.d__213.MoveNext () ---> (Внутреннее исключение № 0) System.Exception: Сборка не удалась. Проверьте окно вывода для получения дополнительной информации. <--- </p>

System.Exception: Сборка не удалась. Для получения дополнительной информации проверьте окно «Вывод».

===================

Код серьезности Описание Состояние подавления строки файла проекта Ошибка веб-развертывания задача не выполнена (Произошла ошибка во время выполнения сценария базы данных. Ошибка произошла между следующими строками сценария: «568» и «581». Подробный журнал может содержать больше информации об ошибке. Команда началась со следующего: «IF НЕ СУЩЕСТВУЕТ (SELECT * FROM [__EFMigrationsHisto "Объект 'PK_AspNetUserTokens' зависит от столбца 'Name'. Ошибка ALTER TABLE ALTER COLUMN Name, поскольку один или несколько объектов получают доступ к этому столбцу. http://go.microsoft.com/fwlink/?LinkId=178587 Подробнее см. В: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_SQL_EXECUTION_FAILURE.) Не удалось опубликовать базу данных sh. Это может произойти, если удаленная база данных не может запустить сценарий. Попробуйте изменить сценарии базы данных или отключить публикацию базы данных в Package / Publi sh Страница веб-свойств. Если сценарий не выполнен из-за того, что таблицы базы данных уже существуют, попробуйте удалить существующие объекты базы данных перед созданием новых. Дополнительные сведения об использовании этих параметров в Visual Studio см. http://go.microsoft.com/fwlink/?LinkId=179181. Сведения об ошибке: Произошла ошибка во время выполнения сценария базы данных. Произошла ошибка между следующими строками скрипта: «568» и «581». Подробный журнал может содержать больше информации об ошибке. Команда началась со следующего: «ЕСЛИ НЕ СУЩЕСТВУЕТ (SELECT * FROM [__EFMigrationsHisto») Объект «PK_AspNetUserTokens» зависит от столбца «Имя». ALTER TABLE ALTER COLUMN Имя не удалось, поскольку один или несколько объектов имеют доступ к этому столбцу. http://go.microsoft.com/fwlink/?LinkId=178587 Подробнее читайте по адресу: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_SQL_EXECUTION_FAILURE. Объект PK_AspNetUserTokens зависит от столбца «Имя». ALTER TABLE ALTER COLUMN Имя не удалось, поскольку один или несколько объектов имеют доступ к этому столбцу. в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection, действие 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject. .TdsParser.TryRun (runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, булева & dataReady) при System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds (String имяМетод, булева ASYN * * тысяча пятьдесят-два, Int32 тайм-аут, булева asyncWrite) в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (завершение TaskCompletionSource`1, строка String methodName, логическое значение sendToPipe, тайм-аут Int32, логический и usedCache, логический асинхронный ввод, логический inRetry) в System.Data.SqlQuCom. Deployment.DBStatementInfo.Execute (соединение DbConnection, транзакция DbTransaction, DeploymentBaseContext b aseContext, Int32 timeout) BethanysPieShop 0

Ниже приведена связанная ошибка, которую я получаю всякий раз, когда во время разработки запускаю команду update-database в консоли диспетчера пакетов:

fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
      Failed executing DbCommand (1,684ms) [Parameters=[], CommandType='Text', CommandTimeout='120']
      DECLARE @var2 sysname;
      SELECT @var2 = [d].[name]
      FROM [sys].[default_constraints] [d]
      INNER JOIN [sys].[columns] [c] ON [d].[parent_column_id] = [c].[column_id] AND [d].[parent_object_id] = [c].[object_id]
      WHERE ([d].[parent_object_id] = OBJECT_ID(N'[AspNetUserTokens]') AND [c].[name] = N'Name');
      IF @var2 IS NOT NULL EXEC(N'ALTER TABLE [AspNetUserTokens] DROP CONSTRAINT [' + @var2 + '];');
      ALTER TABLE [AspNetUserTokens] ALTER COLUMN [Name] nvarchar(128) NOT NULL;
Failed executing DbCommand (1,684ms) [Parameters=[], CommandType='Text', CommandTimeout='120']
DECLARE @var2 sysname;
SELECT @var2 = [d].[name]
FROM [sys].[default_constraints] [d]
INNER JOIN [sys].[columns] [c] ON [d].[parent_column_id] = [c].[column_id] AND [d].[parent_object_id] = [c].[object_id]
WHERE ([d].[parent_object_id] = OBJECT_ID(N'[AspNetUserTokens]') AND [c].[name] = N'Name');
IF @var2 IS NOT NULL EXEC(N'ALTER TABLE [AspNetUserTokens] DROP CONSTRAINT [' + @var2 + '];');
ALTER TABLE [AspNetUserTokens] ALTER COLUMN [Name] nvarchar(128) NOT NULL;
Microsoft.Data.SqlClient.SqlException (0x80131904): The object 'PK_AspNetUserTokens' is dependent on column 'Name'.
ALTER TABLE ALTER COLUMN Name failed because one or more objects access this column.
   at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at Microsoft.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean isAsync, Int32 timeout, Boolean asyncWrite)
   at Microsoft.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String methodName)
   at Microsoft.Data.SqlClient.SqlCommand.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 contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
ClientConnectionId:a2c8216d-8ba5-413c-8ab8-1526fdb7a7e7
Error Number:5074,State:1,Class:16
The object 'PK_AspNetUserTokens' is dependent on column 'Name'.
ALTER TABLE ALTER COLUMN Name failed because one or more objects access this column.

1 Ответ

0 голосов
/ 16 апреля 2020

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

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

При новой миграции все ваши таблицы должны быть установлены правильно без ошибок.

Источник: я сделал то же самое, что и вы, теперь я очень осторожен в том, как я справляюсь с миграциями, и стараюсь правильно их применять, и у меня больше нет проблем.

Если вы используете миграции и update-database, придерживайтесь этого, я бы не стал делать это вручную со скриптами

...