Asp.net core 如何将asp.net 2.2标识表迁移到asp.net 3.1架构?

Asp.net core 如何将asp.net 2.2标识表迁移到asp.net 3.1架构?,asp.net-core,entity-framework-core,asp.net-identity-3,ef-core-3.0,Asp.net Core,Entity Framework Core,Asp.net Identity 3,Ef Core 3.0,我用asp.NETCore2.2启动了一个项目。我使用“代码优先”的方法开发了数据库。后来,我用asp.NET3.1创建了一个新的解决方案。我从现有数据库生成了一个初始迁移。最后,我在新的asp.net 3.1 web应用程序中添加了身份验证和角色。不幸的是,现在EF Core似乎想对标识表进行更改,但失败了。错误消息是: fail: Microsoft.EntityFrameworkCore.Database.Command[20102] Failed executing DbComman

我用asp.NETCore2.2启动了一个项目。我使用“代码优先”的方法开发了数据库。后来,我用asp.NET3.1创建了一个新的解决方案。我从现有数据库生成了一个初始迁移。最后,我在新的asp.net 3.1 web应用程序中添加了身份验证和角色。不幸的是,现在EF Core似乎想对标识表进行更改,但失败了。错误消息是:

fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
  Failed executing DbCommand (17ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
  DECLARE @var0 sysname;
  SELECT @var0 = [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 @var0 IS NOT NULL EXEC(N'ALTER TABLE [AspNetUserTokens] DROP CONSTRAINT [' + @var0 + '];');
  ALTER TABLE [AspNetUserTokens] ALTER COLUMN [Name] nvarchar(128) NOT NULL;
Failed executing DbCommand (17ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
DECLARE @var0 sysname;
SELECT @var0 = [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 @var0 IS NOT NULL EXEC(N'ALTER TABLE [AspNetUserTokens] DROP CONSTRAINT [' + @var0 + '];');
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:bd780164-061d-4b48-bdf0-ae872d83dfd1
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.
失败:Microsoft.EntityFrameworkCore.Database.Command[20102]
执行DbCommand失败(17ms)[参数=[],命令类型='Text',命令超时='30']
声明@var0 sysname;
选择@var0=[d]。[name]
来自[sys].[default_constraints][d]
[d].[parent\u column\u id]=[c].[column\u id]和[d].[parent\u object\u id]=[c].[object\u id]上的内部联接[sys].[columns][c]
其中([d].[parent_object_id]=object_id(N'[AspNetUserTokens]')和[c].[name]=N'name');
如果@var0不是NULL EXEC(N'ALTER TABLE[AspNetUserTokens]DROP CONSTRAINT['+@var0+'];');
ALTER TABLE[AspNetUserTokens]ALTER COLUMN[Name]nvarchar(128)不为空;
执行DbCommand失败(17ms)[参数=[],命令类型='Text',命令超时='30']
声明@var0 sysname;
选择@var0=[d]。[name]
来自[sys].[default_constraints][d]
[d].[parent\u column\u id]=[c].[column\u id]和[d].[parent\u object\u id]=[c].[object\u id]上的内部联接[sys].[columns][c]
其中([d].[parent_object_id]=object_id(N'[AspNetUserTokens]')和[c].[name]=N'name');
如果@var0不是NULL EXEC(N'ALTER TABLE[AspNetUserTokens]DROP CONSTRAINT['+@var0+'];');
ALTER TABLE[AspNetUserTokens]ALTER COLUMN[Name]nvarchar(128)不为空;
Microsoft.Data.SqlClient.SqlException(0x80131904):对象“PK_AspNetUserTokens”依赖于列“Name”。
ALTER TABLE ALTER COLUMN Name失败,因为一个或多个对象访问此列。
位于Microsoft.Data.SqlClient.SqlConnection.OneError(SqlException异常、布尔断开连接、操作'1 wrapCloseInAction)
位于Microsoft.Data.SqlClient.SqlInternalConnection.OneError(SqlException异常、布尔断开连接、操作'1 wrapCloseInAction)
位于Microsoft.Data.SqlClient.TdsParser.throweexception和warning(TdsParserStateObject stateObj、布尔调用者连接锁、布尔异步关闭)
位于Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior RunBehavior、SqlCommand cmdHandler、SqlDataReader dataStream、BulkCopySimpleResultSet bulkCopyHandler、TdsParserStateObject stateObj、Boolean和dataReady)
位于Microsoft.Data.SqlClient.SqlCommand.RunExecuteOnQueryTds(字符串方法名、布尔isAsync、Int32超时、布尔asyncWrite)
位于Microsoft.Data.SqlClient.SqlCommand.InternalExecuteOnQuery(TaskCompletionSource`1完成,布尔sendToPipe,Int32超时,布尔和usedCache,布尔异步写入,布尔inRetry,字符串方法名)
在Microsoft.Data.SqlClient.SqlCommand.ExecuteOnQuery()中
位于Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteOnQuery(RelationalCommandParameterObject parameterObject)
位于Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteOnQuery(IRelationalConnection连接,iRelationalYDictionary`2参数值)
位于Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecutionQuery(IEnumerable`1 migrationCommands,IRelationalConnection)
位于Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(字符串targetMigration)
位于Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration,String contextType)
位于Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(字符串targetMigration,字符串contextType)
在Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.c__DisplayClass0_0.b_0()中
位于Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(操作)
客户连接ID:bd780164-061d-4b48-bdf0-ae872d83dfd1
错误号:5074,状态:1,类别:16
对象“PK_AspNetUserTokens”依赖于列“Name”。
ALTER TABLE ALTER COLUMN Name失败,因为一个或多个对象访问此列。
它要运行的迁移代码是:

    migrationBuilder.AlterColumn<string>(
        name: "Name",
        table: "AspNetUserTokens",
        maxLength: 128,
        nullable: false,
        oldClrType: typeof(string),
        oldType: "nvarchar(450)");

    migrationBuilder.AlterColumn<string>(
        name: "LoginProvider",
        table: "AspNetUserTokens",
        maxLength: 128,
        nullable: false,
        oldClrType: typeof(string),
        oldType: "nvarchar(450)");

    migrationBuilder.AlterColumn<string>(
        name: "ProviderKey",
        table: "AspNetUserLogins",
        maxLength: 128,
        nullable: false,
        oldClrType: typeof(string),
        oldType: "nvarchar(450)");

    migrationBuilder.AlterColumn<string>(
        name: "LoginProvider",
        table: "AspNetUserLogins",
        maxLength: 128,
        nullable: false,
        oldClrType: typeof(string),
        oldType: "nvarchar(450)");
migrationBuilder.AlterColumn(
姓名:“姓名”,
表:“AspNetUserTokens”,
最大长度:128,
可为空:false,
oldClrType:typeof(字符串),
旧式:“nvarchar(450)”;
migrationBuilder.AlterColumn(
名称:“登录提供者”,
表:“AspNetUserTokens”,
最大长度:128,
可为空:false,
oldClrType:typeof(字符串),
旧式:“nvarchar(450)”;
migrationBuilder.AlterColumn(
名称:“ProviderKey”,
表:“AspNetUserLogins”,
最大长度:128,
可为空:false,
oldClrType:typeof(字符串),
旧式:“nvarchar(450)”;
migrationBuilder.AlterColumn(
名称:“登录提供者”,
表:“AspNetUserLogins”,
最大长度:128,
可为空:false,
oldClrType:typeof(字符串),
旧式:“nvarchar(450)”;

我的猜测是,在asp.NET2.2和asp.NET3.1之间对此进行了一些更改。但现在,我如何协调这一点

我想这是本地计算机中的一个应用程序,为什么不直接删除数据库呢?当您再次运行应用程序时,实体框架将重新创建它。如果您想在SQL Server实例上更新数据库,可以使用SQL Server数据工具并执行一次迁移。

对于您的问题,您可以尝试回滚迁移,直到最后一次成功,然后再次迁移数据库。我从一个新的3.1解决方案开始,并从2.2解决方案手动复制了相关代码。