首页 > 解决方案 > 错误:添加外键 - 在表“X”上插入或更新违反外键约束“FK_X_Y_Z”

问题描述

我正在尝试使用 ForeignKey 更新数据库表。

在 Departures 我有“AirportCode”列。在航班内,我有“DepartureAirportCode”列。我试图将 DepartureAirportCode 添加为 ForeignKey。

我得到了这个错误。

失败:

Microsoft.EntityFrameworkCore.Database.Command[20102] 未能执行 DbCommand (213ms) [Parameters=[], CommandType='Text', CommandTimeout='300'] ALTER TABLE "Flight" 添加约束 "FK_Flight_Departures_DepartureAirportCode" FOREIGN KEY ("DepartureAirportCode" ) 在删除 CASCADE 时引用“Departures”(“AirportCode”);执行 DbCommand 失败 (213ms) [Parameters=[], CommandType='Text', CommandTimeout='300'] ALTER TABLE "Flight" ADD CONSTRAINT "FK_Flight_Departures_DepartureAirportCode" FOREIGN KEY ("DepartureAirportCode") REFERENCES "Departures" ("AirportCode")删除级联;Npgsql.PostgresException (0x80004005): 23503: 在表“Flight”上插入或更新违反外键约束“

消息文本

在表“Flight”上插入或更新违反了外键约束“FK_Flight_Departures_DepartureAirportCode” 详细信息:表“Departures”中不存在键 (DepartureAirportCode)=()。

更新:解决了这个问题。我的数据库出发表数据的问题。谢谢

标签: postgresqlasp.net-coreentity-framework-coreef-code-first

解决方案


只有主键或备用(或主)键可以用作外键。我强烈建议您使用 Departure 主键 ID 作为外键。您可以尝试配置一个替代键,但我看不出让您的数据库结构更加复杂的意义。如果将来 AirportCode 发生变化,您将在 db 更新方面遇到非常大的问题。这就是为什么在大多数数据库中使用独立键的原因。

public class Flight
    {
        [Key]
        public int Id { get; set; }

        [Required]
        public int? DepartureId{ get; set; }

        public Departure Departure { get; set; }
}

但如果您仍然想要航班中的出发代码,则不需要保留 2 把钥匙。最简单的方法是将出发代码作为主要代码

public class Departure
    {
        [Key]
        public string Code { get; set; }

        [InverseProperty(nameof(Flight.Departure))]
        public IEnumerable<Flight> Flights { get; set; }
    }

public class Flight
    {   [Key]
        public int Id { get; set; }

        public string DepartureCode { get; set; }

        [ForeignKey(nameof(DepartureCode))]
        [InverseProperty("Flights")]
        public virtual Departure Departure { get; set; }
}

你不需要这个,因为你有属性注释。但以防万一

modelBuilder.Entity<Flight>(entity =>
            {
                entity.HasOne(d => d.Departure)
                   .WithMany(p => p.Flights)
                   .HasForeignKey(d => d.DepartureCode);
            });

推荐阅读