【问题标题】:Error : Adding a Foreign key - insert or update on table "X" violates foreign key constraint "FK_X_Y_Z"错误:添加外键 - 在表“X”上插入或更新违反外键约束“FK_X_Y_Z”
【发布时间】:2021-12-12 21:03:59
【问题描述】:

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

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

我收到了这个错误。

失败:

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

消息文本

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

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

【问题讨论】:

  • 如果您需要帮助,您必须发布您的课程
  • 我已经更新了课程。
  • 嗨@hanushic,请分享你的模型类,如果你在dbcontext中配置了任何关系。另外,请分享一下你操作数据库的代码是什么。

标签: postgresql asp.net-core entity-framework-core ef-code-first


【解决方案1】:

只有主键或备用(或主)键可以用作外键。我强烈建议您使用 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);
            });

【讨论】:

  • 我在这篇文章 entityframeworkcore.com/knowledge-base/54799285/… 上尝试过。外键不应该是另一个表的主键。我已经用 DbContext 更新了我的问题。请检查
  • @hanushic 查看我的答案更新
  • 我希望 DepartureAirportCode 作为 Flight Table 中的外键。你做了`[NotMapped]`。所以它不会在我的数据库中
猜你喜欢
  • 2020-02-07
  • 2013-09-06
  • 2011-01-27
  • 2019-06-16
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 2020-09-07
相关资源
最近更新 更多