运行 .NET core 2.2 应用程序中的 EF 核心命令 'update database' 正在应用旧迁移而不是当前迁移
Running EF core command 'update database' in .NET core 2.2 app is applying an old migration instead of the current one
我正在开发 .NET Core 2.2 版应用程序(Angular),它使用 EF Core(代码优先)。它已经存在几年了,我大约一个月前克隆了它。以前的迁移文件很多,貌似都已经应用了。
我对模型进行了一些更改,更新了上下文,并使用以下方法创建了一个新迁移:
dotnet ef migrations add AddAssignmentEndDateToSMEAssignment
迁移文件创建没有问题,上下文快照和一切看起来都很好。我运行接下来:
dotnet ef database update
我收到以下错误:
> Applying migration '20200323181854_userProfileUpdate'.
Failed executing DbCommand (35ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [nssr_roles] (
[role_name] varchar(255) NOT NULL,
CONSTRAINT [PK_nssr_roles] PRIMARY KEY ([role_name])
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary 2 parameterValues)
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary 2 parameterValues)
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.UpdateDatabase.<>c__DisplayClass0_1.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
ClientConnectionId:ff4b615f-69a6-450e-9c8e-4f3e5de4497c
Error Number:2714,State:6,Class:16
There is already an object named 'nssr_roles' in the database.
因此,它正在尝试应用旧迁移(20200323181854_userProfileUpdate - 至少从 2020 年开始),它正在处理完全不同的 table (nssr_roles)。我知道有人在开发这个应用程序,大约 3 周前进行了一次新的迁移,所以这不是待定的。我也尝试了以下命令,同样的事情:
dotnet ef database update 20220506044703_AddAssignmentEndDateToSMEAssignment
&
dotnet ef database update AddAssignmentEndDateToSMEAssignment
我尝试删除我新添加的迁移,然后在删除后我 运行 再次删除以查看是否有任何待处理的内容:
dotnet ef migrations remove
但是没有,它显示了最新应用的迁移(我的同事 3 周前所做的那个),并有一条消息说它已经应用了。
这是怎么回事,我该怎么做才能解决这个问题?我不想删除数据库中的任何内容,所以我不想删除迁移并从头开始。进行迁移然后推送到 git 时会不会出现问题,导致拉取它的人出现问题?
顺便说一句,我知道它是一个旧版本,应该会在路上进行更新
所以我了解到我们团队的做法有所不同:
他们执行的不是 运行ning 那个更新命令:
dotnet ef migrations script [lastMigration] [newMigration]
所以它不会像更新命令那样自动更新数据库,但它会输出一个 SQL 脚本,一旦你确认脚本正在执行它,你就会在数据库中 运行应该做的。这样做似乎不太直观,但如果你有很多外键等,它显然会增加一点安全性。
仍然不确定为什么要进行的有问题的迁移(旧迁移)不在历史记录中table,但这种方法有效。
我正在开发 .NET Core 2.2 版应用程序(Angular),它使用 EF Core(代码优先)。它已经存在几年了,我大约一个月前克隆了它。以前的迁移文件很多,貌似都已经应用了。
我对模型进行了一些更改,更新了上下文,并使用以下方法创建了一个新迁移:
dotnet ef migrations add AddAssignmentEndDateToSMEAssignment
迁移文件创建没有问题,上下文快照和一切看起来都很好。我运行接下来:
dotnet ef database update
我收到以下错误:
> Applying migration '20200323181854_userProfileUpdate'.
Failed executing DbCommand (35ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [nssr_roles] (
[role_name] varchar(255) NOT NULL,
CONSTRAINT [PK_nssr_roles] PRIMARY KEY ([role_name])
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary 2 parameterValues)
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary 2 parameterValues)
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.UpdateDatabase.<>c__DisplayClass0_1.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
ClientConnectionId:ff4b615f-69a6-450e-9c8e-4f3e5de4497c
Error Number:2714,State:6,Class:16
There is already an object named 'nssr_roles' in the database.
因此,它正在尝试应用旧迁移(20200323181854_userProfileUpdate - 至少从 2020 年开始),它正在处理完全不同的 table (nssr_roles)。我知道有人在开发这个应用程序,大约 3 周前进行了一次新的迁移,所以这不是待定的。我也尝试了以下命令,同样的事情:
dotnet ef database update 20220506044703_AddAssignmentEndDateToSMEAssignment
&
dotnet ef database update AddAssignmentEndDateToSMEAssignment
我尝试删除我新添加的迁移,然后在删除后我 运行 再次删除以查看是否有任何待处理的内容:
dotnet ef migrations remove
但是没有,它显示了最新应用的迁移(我的同事 3 周前所做的那个),并有一条消息说它已经应用了。
这是怎么回事,我该怎么做才能解决这个问题?我不想删除数据库中的任何内容,所以我不想删除迁移并从头开始。进行迁移然后推送到 git 时会不会出现问题,导致拉取它的人出现问题?
顺便说一句,我知道它是一个旧版本,应该会在路上进行更新
所以我了解到我们团队的做法有所不同: 他们执行的不是 运行ning 那个更新命令:
dotnet ef migrations script [lastMigration] [newMigration]
所以它不会像更新命令那样自动更新数据库,但它会输出一个 SQL 脚本,一旦你确认脚本正在执行它,你就会在数据库中 运行应该做的。这样做似乎不太直观,但如果你有很多外键等,它显然会增加一点安全性。
仍然不确定为什么要进行的有问题的迁移(旧迁移)不在历史记录中table,但这种方法有效。