如何首先使用ef代码将表中的键用于另一个表中的两个不同列

Posted

技术标签:

【中文标题】如何首先使用ef代码将表中的键用于另一个表中的两个不同列【英文标题】:how to use a key from a table for two different columns in another table using ef code first 【发布时间】:2021-12-13 13:05:30 【问题描述】:

我有两个具有一对多关系的表。

    航班表 目标表

我必须将 Destination 表中的 AirportCode 用于航班表中的两列。

    DepartureAirportCode - column_1 ArrivalAirportCode - c0lumn_2

如何通过首先使用 EF 代码来做到这一点?

我已尝试使用以下代码。但这是不正确的。我只能为一列添加外键。

public class Flight
    
        public int Id  get; set; 

        [Required]
        public string DepartureAirportCode  get; set;    // sholud be foreign key of Destinations_AirportCode

        [Required]
        public string ArrivalAirportCode  get; set;    // sholud be foreign key of Destinations_AirportCode

        public Destination Airport  get; set; 
    

 public class Destinations
    
        public int Id  get; private set; 
        public string AirportCode  get; private set; 
        public IEnumerable<Flight> Flights  get; set; 
  

数据库上下文

builder.Entity<Flight>()
                .HasOne(x => x.Airport)
                .WithMany(x => x.Flights)
                .HasForeignKey(x => x.ArrivalAirportCode)
                .HasPrincipalKey(x => x.AirportCode);
            
            builder.Entity<Flight>()
                .HasOne(x => x.Airport)
                .WithMany(x => x.Flights)
                .HasForeignKey(x => x.DepartureAirportCode)
                .HasPrincipalKey(x => x.AirportCode);

编辑:添加迁移文件

我已经为将 ArrivalAirportCode 添加为外键进行了迁移和数据库更新。

当我尝试将 DepartureAirportCode 的迁移添加为外键时,我得到了这个

 migrationBuilder.DropForeignKey(
                name: "FK_Flight_Destinations_ArrivalAirportCode",
                table: "Flight");                
// here dropped FK_Flight_Destinations_ArrivalAirportCode . But not added later. 


            migrationBuilder.DropForeignKey(   
                name: "FK_Flight_Departures_DepartureAirportCode",
                table: "Flight");             
 // please ignore above line. Because already I used FK_Flight_Departures_DepartureAirportCode - foreign key from a different table named as Departures. Now I want to use FK_Flight_Destinations_DepartureAirportCode and FK_Flight_Destinations_ArrivalAirportCode from Destinations table


migrationBuilder.AddForeignKey(
                name: "FK_Flight_Destinations_DepartureAirportCode",
                table: "Flight",
                column: "DepartureAirportCode",
                principalTable: "Destinations",
                principalColumn: "AirportCode",
                onDelete: ReferentialAction.Cascade);     
// added only FK_Flight_Destinations_DepartureAirportCode. I want two column with  foreign key  FK_Flight_Destinations_DepartureAirportCode and FK_Flight_Destinations_ArrivalAirportCode

【问题讨论】:

请将您收到的错误消息添加到您的问题中。 我添加了迁移。请检查。 【参考方案1】:

您的问题是您试图为FlightDestination 之间的两个不同关系使用相同的属性。 Flight 上的 Airport 属性和 Destination 上的 Flights 属性都用于“到达”关系以及“目的地”关系 - 而这对于 EF 是不可能的。

因此,在您的 Flight 类中,您缺少与 Destination 的第二个关系的属性,因为您不能将相同的属性用于 Arrival 和 Depature(因为它们是不同的机场):

public class Flight

    public int Id  get; set; 

    [Required]
    public string DepartureAirportCode  get; set;    // sholud be foreign key of Destinations_AirportCode

    [Required]
    public string ArrivalAirportCode  get; set;    // sholud be foreign key of Destinations_AirportCode

    public Destination DepartureAirport  get; set; 

    public Destination ArrivalAirport  get; set; 

Destination 也一样:

public class Destination

    public int Id  get; private set; 

    public string AirportCode  get; private set; 

    public IEnumerable<Flight> ArrivalFlights  get; set; 

    public IEnumerable<Flight> DepartureFlights  get; set; 


一旦你添加它并将你的配置更改为:

builder
    .Entity<Flight>()
    .HasOne(x => x.ArrivalAirport)
    .WithMany(x => x.ArrivalFlights)
    .HasForeignKey(x => x.ArrivalAirportCode)
    .HasPrincipalKey(x => x.AirportCode);
            
builder.Entity<Flight>()
    .HasOne(x => x.DepartureAirport)
    .WithMany(x => x.DepartureFlights)
    .HasForeignKey(x => x.DepartureAirportCode)
    .HasPrincipalKey(x => x.AirportCode);

它应该可以工作。

【讨论】:

很遗憾,AirportCode 不是密钥 @Vince 你是对的AirportCode 至少必须是备用键 @Vince 非常感谢。它工作正常。 AirportCode 是 Destination 的关键

以上是关于如何首先使用ef代码将表中的键用于另一个表中的两个不同列的主要内容,如果未能解决你的问题,请参考以下文章

将表中的列与 hive 中另一个表的列进行比较

如何将表中的数据用作 SQL 中另一个命令的值?

将表的组件映射为另一个表中的arraylist,如onetomany

mysql 设置外键,能否将表中多个字段关联到另一个表中的同一字段

显示一个表中的条目数,对于 SQL 中两个表共享的键,同时还包括在另一个表中没有位置的条目

如何将一个数据库中的一个表复制到另一个数据库中的表中