我还使用Entity Framework Core 3.1在ASP.NET Core 3.1中构建了一个Web应用程序,现在正尝试将其发布到Azure。但是,在开发阶段,当我使用自定义ApplicationUser类扩展了内置IdentityUser类时,我的EF迁移就停止了向数据库的发布。迁移已成功创建,但是update-database命令始终失败。
因为我无法理解错误消息,所以我只是根据每个后续迁移文件中包含的信息来手动更新数据库表。在仍处于开发状态时,这种方法仍然可以正常工作,但是现在我想将应用程序发布到Azure,同样的错误使该应用程序根本无法在Azure上托管。
基本上,当Azure尝试创建数据库时,在开发过程中遇到的完全相同的错误会阻止数据库的成功创建。而且由于我在开发过程中使用了手动解决方法,所以我不知道现在尝试将应用程序发布到Azure时如何解决错误。
以下是尝试发布到Azure时收到的错误消息:
System.AggregateException:发生一个或多个错误。---> System.Exception:构建失败。检查“输出”窗口以获取更多详细信息。---内部异常堆栈跟踪的结尾---在System.Threading.Tasks.Task.Task.Wait(Int32毫秒超时,CancellationToken cancelleToken)在System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)在Microsoft.WebTools.Publish。 PublishService.VsWebProjectPublish。<> c.DisplayClass43_0.b__3()在System.Threading.Tasks.Task`1.InnerInvoke()在System.Threading.Tasks.Task.Execute()-从上次发生异常的位置开始的堆栈跟踪结束在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)-在Microsoft.Publish.Framework.ViewModel上抛出。ProfileSelectorViewModel.d__213.MoveNext()--->(内部异常#0)System.Exception:构建失败。检查输出窗口以获取更多详细信息。
System.Exception:构建失败。检查“输出”窗口以获取更多详细信息。
===================
严重性代码说明项目文件行抑制状态错误Web部署任务失败。(在执行数据库脚本的过程中发生了错误。该脚本的以下各行之间发生了错误:“ 568”和“ 581”。详细的日志可能包含有关该错误的更多信息。该命令以以下内容开头:不存在(SELECT * FROM [__EFMigrationsHisto“对象'PK_AspNetUserTokens'取决于列'Name'。ALTER TABLE ALTER COLUMN名称失败,因为一个或多个对象访问此列。http: //go.microsoft.com/fwlink/? LinkId = 178587了解更多信息:http : //go.microsoft.com/fwlink/? LinkId=221672#ERROR_SQL_EXECUTION_FAILURE。)无法发布数据库。如果远程数据库无法运行脚本,则会发生这种情况。尝试修改数据库脚本,或在“打包/发布Web属性”页面中禁用数据库发布。如果脚本由于数据库表已经存在而失败,请尝试在创建新数据库对象之前删除现有数据库对象。有关在Visual Studio中执行这些选项的更多信息,请参见http://go.microsoft.com/fwlink/?LinkId=179181。错误详细信息:在执行数据库脚本期间发生错误。该脚本的以下各行之间发生了错误:“ 568”和“ 581”。详细日志可能包含有关该错误的更多信息。该命令以以下内容开头:“ IF NOT EXISTS(SELECT * FROM [__EFMigrationsHisto”“)对象'PK_AspNetUserTokens'取决于列'Name'。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
System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReadS数据状态,BulkStateCopySimpleState,ObjectDataCopyS,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,ObjectState,对象状态,对象状态,状态集在System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1完成时,String methodName,布尔methodName,布尔sendToPipe,Int32超时, Microsoft.Web.Deployment.DBStatementInfo.Execute(DbConnection连接)处System.Data.SqlClient.SqlCommand.ExecuteNonQuery()处的Boolean&usedCache,Boolean asyncWrite,Boolean inRetry),DbTransaction事务,DeploymentBaseContext baseContext,Int32超时)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.
我认为在这种情况下,您最好做的是,因为还没有任何实际数据可使用,因此,如果在所需位置设置了所有内容,则可以删除迁移,清除数据库,然后启动数据库。从头开始迁移和数据库。
我知道这不是理想的处理方式,但是我认为从开始迁移和更新数据库开始,然后转向使用迁移脚本手动更新数据库,这将非常困难并且几乎不可能它返回到您需要的地方。
进行新的迁移后,您所有的表都应正确设置而不会出错。
资料来源:我做的和您做的完全一样,现在我非常小心如何处理迁移并确保正确应用它们,而且没有其他问题了。
如果您正在使用迁移和更新数据库,请坚持这样做,我不会使用脚本手动进行
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句