我最近回滚了EF Core迁移,该迁移删除了带有“主题”表的外键的现有数据库表(称为“标签”表)。
“主题”表与“标签”表具有一对多关系。
一个主题有很多标签。
当尝试使用外键重新建立(重新创建)Tag表时,我收到以下错误:错误号:4902,状态:1,类:16,并且迁移失败。
标签表不存在。由于迁移回滚而被删除。
public class Subject
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Color { get; set; }
}
public class Tag
{
public int Id { get; set; }
[Required]
public string Description { get; set; }
[Required]
public string Narrative { get; set; }
public int SubjectId { get; set; }
[ForeignKey("SubjectId")]
public virtual Subject Subject { get; set; }
}
Here is my migration:
public partial class AddTagToDb : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Tag_Subject_SubjectId",
table: "Tag");
migrationBuilder.AlterColumn<int>(
name: "SubjectId",
table: "Tag",
nullable: false,
oldClrType: typeof(int),
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Narrative",
table: "Tag",
nullable: false,
oldClrType: typeof(string),
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Description",
table: "Tag",
nullable: false,
oldClrType: typeof(string),
oldNullable: true);
migrationBuilder.AddForeignKey(
name: "FK_Tag_Subject_SubjectId",
table: "Tag",
column: "SubjectId",
principalTable: "Subject",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Tag_Subject_SubjectId",
table: "Tag");
migrationBuilder.AlterColumn<int>(
name: "SubjectId",
table: "Tag",
nullable: true,
oldClrType: typeof(int));
migrationBuilder.AlterColumn<string>(
name: "Narrative",
table: "Tag",
nullable: true,
oldClrType: typeof(string));
migrationBuilder.AlterColumn<string>(
name: "Description",
table: "Tag",
nullable: true,
oldClrType: typeof(string));
migrationBuilder.AddForeignKey(
name: "FK_Tag_Subject_SubjectId",
table: "Tag",
column: "SubjectId",
principalTable: "Subject",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
}
Error message encountered after update-migrtation:
PM> update-database
Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core 2.2.6-servicing-10079 initialized 'ApplicationDbContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (4ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT OBJECT_ID(N'[__EFMigrationsHistory]');
Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT OBJECT_ID(N'[__EFMigrationsHistory]');
Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT [MigrationId], [ProductVersion]
FROM [__EFMigrationsHistory]
ORDER BY [MigrationId];
Applying migration '20190804003447_AddTagToDb'.
Microsoft.EntityFrameworkCore.Migrations[20402]
Applying migration '20190804003447_AddTagToDb'.
fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
Failed executing DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
ALTER TABLE [Tag] DROP CONSTRAINT [FK_Tag_Subject_SubjectId];
System.Data.SqlClient.SqlException (0x80131904): Cannot find the object "Tag" because it does not exist or you do not have permissions.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
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)
ClientConnectionId:4c476313-8831-48bc-b88d-e6979ff701bf
Error Number:4902,State:1,Class:16
Failed executing DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
ALTER TABLE [Tag] DROP CONSTRAINT [FK_Tag_Subject_SubjectId];
System.Data.SqlClient.SqlException (0x80131904): Cannot find the object "Tag" because it does not exist or you do not have permissions.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
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:4c476313-8831-48bc-b88d-e6979ff701bf
Error Number:4902,State:1,Class:16
Cannot find the object "Tag" because it does not exist or you do not have permissions.