如何首先使用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】:您的问题是您试图为Flight
和Destination
之间的两个不同关系使用相同的属性。 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代码将表中的键用于另一个表中的两个不同列的主要内容,如果未能解决你的问题,请参考以下文章
将表的组件映射为另一个表中的arraylist,如onetomany
mysql 设置外键,能否将表中多个字段关联到另一个表中的同一字段