繁体   English   中英

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

[英]Update-Database fails on foreign key conflict

我有一个使用实体框架的应用程序。 它包含几个执行各种数据库操作的迁移文件。 另一个用户一直在直接对数据库进行更新,现在我在运行Update-Database时无法应用我的迁移。 这是我得到的错误:

PM> Update-Database Build started... Build 成功。 执行 DbCommand 失败 (56ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] ALTER TABLE [Balance1Part] 添加约束 [FK_Balance1Part_Balance1_Balance1Id] 外键 ([Balance1Id]) REFERENCES [Balance1] ([Id])删除级联; 失败: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):ALTER TABLE 语句与 FOREIGN KEY 约束“FK_Balance1Part_Balance1_Balance1Id”冲突。 冲突发生在数据库“db-vrhit05042021”、表“dbo.Balance1”、“Id”列中。 在 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 ) 在 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 错误号:547,State:0,Class:16 ALTER TABLE 语句与 FOREIGN KEY 约束“FK_Balance1Part_Balance1_Balance1Id”冲突。 冲突发生在数据库“db-vrhit05042021”、表“dbo.Balance1”、“Id”列中。

我希望在这里应用的迁移应该添加外键FK_Balance1Part_Balance1_Balance1Id并且该外键似乎不存在于数据库中。 我该如何解决这个问题?

我正在尝试在 Azure SQL 服务器实例上执行此操作。

这是迁移:

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");
    }
}

语境:

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()");
        }
    }
}

我会说发生此错误是因为您尝试将外键从Balance1Part.Balance1Id添加到Balance1.IdBalance1.Id中的某些值与Balance1Part.Balance1Id中的任何值都不匹配。 应该不可能创建违反参照完整性的关系。 尝试检查Balance1Part中是否缺少键:

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

要解决添加migrationBuilder.Sql("DELETE FROM [Balance1Part]", true); 到迁移。

暂无
暂无

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

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