简体   繁体   English

更新数据库因外键冲突而失败

[英]Update-Database fails on foreign key conflict

I've an application which uses Entity Framework.我有一个使用实体框架的应用程序。 It contains several migration files which do various database operations.它包含几个执行各种数据库操作的迁移文件。 Another user has been making updates directly to the database and now I can't get one of my migrations to apply when I run Update-Database .另一个用户一直在直接对数据库进行更新,现在我在运行Update-Database时无法应用我的迁移。 This is the error I get:这是我得到的错误:

PM> Update-Database Build started... Build succeeded. PM> Update-Database Build started... Build 成功。 Failed executing DbCommand (56ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] ALTER TABLE [Balance1Part] ADD CONSTRAINT [FK_Balance1Part_Balance1_Balance1Id] FOREIGN KEY ([Balance1Id]) REFERENCES [Balance1] ([Id]) ON DELETE CASCADE;执行 DbCommand 失败 (56ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] ALTER TABLE [Balance1Part] 添加约束 [FK_Balance1Part_Balance1_Balance1Id] 外键 ([Balance1Id]) REFERENCES [Balance1] ([Id])删除级联; fail: Microsoft.EntityFrameworkCore.Database.Command[20102] Failed executing DbCommand (56ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] ALTER TABLE [Balance1Part] ADD CONSTRAINT [FK_Balance1Part_Balance1_Balance1Id] FOREIGN KEY ([Balance1Id]) REFERENCES [Balance1] ([Id]) ON DELETE CASCADE;失败:Microsoft.EntityFrameworkCore.Database.Command[20102] 执行 DbCommand 失败(56 毫秒)[Parameters=[],CommandType='Text',CommandTimeout='30'] ALTER TABLE [Balance1Part] 添加约束 [FK_Balance1Part_Balance1_Balance1Id] 外键([ Balance1Id]) REFERENCES [Balance1] ([Id]) ON DELETE CASCADE; Microsoft.Data.SqlClient.SqlException (0x80131904): The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_Balance1Part_Balance1_Balance1Id". Microsoft.Data.SqlClient.SqlException (0x80131904):ALTER TABLE 语句与 FOREIGN KEY 约束“FK_Balance1Part_Balance1_Balance1Id”冲突。 The conflict occurred in database "db-vrhit05042021", table "dbo.Balance1", column 'Id'.冲突发生在数据库“db-vrhit05042021”、表“dbo.Balance1”、“Id”列中。 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在 Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,Boolean breakConnection,Action 1 wrapCloseInAction) at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction)处.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.在 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 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(Str 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 ) 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(Str ing 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:b538f2ff-0a95-4975-ab15-ed75eca72382 Error Number:547,State:0,Class:16 The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_Balance1Part_Balance1_Balance1Id". ing 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:b538f2ff-0a95- 4975-ab15-ed75eca72382 错误号:547,State:0,Class:16 ALTER TABLE 语句与 FOREIGN KEY 约束“FK_Balance1Part_Balance1_Balance1Id”冲突。 The conflict occurred in database "db-vrhit05042021", table "dbo.Balance1", column 'Id'.冲突发生在数据库“db-vrhit05042021”、表“dbo.Balance1”、“Id”列中。

The migration I'm looking to apply here should add the foreign key FK_Balance1Part_Balance1_Balance1Id and that foreign key doesn't seem to exist on the database.我希望在这里应用的迁移应该添加外键FK_Balance1Part_Balance1_Balance1Id并且该外键似乎不存在于数据库中。 How can I resolve this issue?我该如何解决这个问题?

I'm trying to do this on an Azure SQL Server instance.我正在尝试在 Azure SQL 服务器实例上执行此操作。

Here's the migration:这是迁移:

public partial class AddIdcolumns : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AddColumn<int>(
            name: "CalibrationId",
            table: "Symptoms",
            nullable: false,
            defaultValue: 0);

        migrationBuilder.AddColumn<int>(
            name: "Id",
            table: "Balance1",
            nullable: false,
            defaultValue: 0)
            .Annotation("SqlServer:Identity", "1, 1");

        migrationBuilder.AddPrimaryKey(
            name: "PK_Balance1",
            table: "Balance1",
            column: "Id");

        migrationBuilder.CreateIndex(
            name: "IX_Symptoms_CalibrationId",
            table: "Symptoms",
            column: "CalibrationId");

        migrationBuilder.CreateIndex(
            name: "IX_Balance1Part_Balance1Id",
            table: "Balance1Part",
            column: "Balance1Id");

        migrationBuilder.AddForeignKey(
            name: "FK_Balance1Part_Balance1_Balance1Id",
            table: "Balance1Part",
            column: "Balance1Id",
            principalTable: "Balance1",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);

        migrationBuilder.AddForeignKey(
            name: "FK_Symptoms_Calibration_CalibrationId",
            table: "Symptoms",
            column: "CalibrationId",
            principalTable: "Calibration",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropForeignKey(
            name: "FK_Balance1Part_Balance1_Balance1Id",
            table: "Balance1Part");

        migrationBuilder.DropForeignKey(
            name: "FK_Symptoms_Calibration_CalibrationId",
            table: "Symptoms");

        migrationBuilder.DropIndex(
            name: "IX_Symptoms_CalibrationId",
            table: "Symptoms");

        migrationBuilder.DropIndex(
            name: "IX_Balance1Part_Balance1Id",
            table: "Balance1Part");

        migrationBuilder.DropPrimaryKey(
            name: "PK_Balance1",
            table: "Balance1");

        migrationBuilder.DropColumn(
            name: "CalibrationId",
            table: "Symptoms");

        migrationBuilder.DropColumn(
            name: "Id",
            table: "Balance1");
    }
}

Context:语境:

public class VRHitContext : DbContext
{
    public VRHitContext(DbContextOptions<VRHitContext> options)
        : base(options)
    {

    }

    public DbSet<Organisation> Organisations { get; set; }
    public DbSet<ClientDeviceRegistration> ClientDeviceRegistrations { get; set; }

    public DbSet<Session> Sessions { get; set; }
    public DbSet<User> Users { get; set; }

    public DbSet<DataFile> DataFiles { get; set; }

    public DbSet<Symptoms> Symptoms { get; set; }
    public DbSet<Balance1> Balance1 { get; set; }
    public DbSet<Balance1Raw> Balance1Raw { get; set; }
    public DbSet<Balance2> Balance2 { get; set; }
    public DbSet<Balance2Raw> Balance2Raw { get; set; }
    public DbSet<Calibration> Calibration { get; set; }
    public DbSet<CogMotor1> CogMotor1 { get; set; }
    public DbSet<CogMotor1Raw> CogMotor1Raw { get; set; }
    public DbSet<CogMotor2> CogMotor2 { get; set; }
    public DbSet<CogMotor2Raw> CogMotor2Raw { get; set; }

    public DbSet<CogMotor3> CogMotor3 { get; set; }
    public DbSet<CogMotor3Raw> CogMotor3Raw { get; set; }

    public DbSet<Gait> Gait { get; set; }
    public DbSet<GaitRaw> GaitRaw { get; set; }

    public DbSet<Interception1> Interception1 { get; set; }
    public DbSet<Interception2> Interception2 { get; set; }
    public DbSet<InterceptionPlayerRaw> InterceptionPlayerRaw { get; set; }
    public DbSet<ManualDexterity> ManualDexterity { get; set; }
    public DbSet<ManualDexterityRaw> ManualDexterityRaw { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().HasIndex(u => u.UserIdentifier).IsUnique();
        modelBuilder.Entity<Balance1Part>()
            .HasKey(o => new { o.Id, o.Balance1Id });

        // Set default decimal precision.
        foreach (var property in modelBuilder.Model.GetEntityTypes()
            .SelectMany(t => t.GetProperties())
            .Where(p => p.ClrType == typeof(decimal) || p.ClrType == typeof(decimal?)))
                    {
                        property.SetColumnType("decimal(38, 10)");
                    }


        // Set default for GUID primary keys.
        foreach (var property in modelBuilder.Model.GetEntityTypes()
            .SelectMany(t => t.GetProperties())
            .Where(p => (p.ClrType == typeof(Guid) || p.ClrType == typeof(Guid?)) && p.IsPrimaryKey()))
        {
            property.SetDefaultValueSql("NEWID()");
        }
    }
}

I would say that this error occurred because you tried to add a foreign key from Balance1Part.Balance1Id to Balance1.Id but some values in Balance1Part.Balance1Id don't match any in Balance1.Id .我会说发生此错误是因为您尝试将外键从Balance1Part.Balance1Id添加到Balance1.IdBalance1.Id中的某些值与Balance1Part.Balance1Id中的任何值都不匹配。 It should be impossible to create a relation that violates referential integrity.应该不可能创建违反参照完整性的关系。 Try checking for missing keys in Balance1Part :尝试检查Balance1Part中是否缺少键:

SELECT Balance1Id FROM Balance1Part
WHERE Balance1Id NOT IN
(SELECT Id from Balance1)

To resolve add migrationBuilder.Sql("DELETE FROM [Balance1Part]", true);要解决添加migrationBuilder.Sql("DELETE FROM [Balance1Part]", true); to the migration.到迁移。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM