天天看點

EF Core 中的 InverseProperty 屬性

作者:全棧音樂

InverseProperty 通知 EF Core,它在關系的另一端與哪個導航屬性相關。 EF Core中的預設約定僅在兩個實體之間存在單一關系時才能正确識别。 但在多重關系的情況下,它無法正确識别它們。 在這種情況下,我們使用 InverseProperty 來幫助 EF 核心正确識别關系。

InverseProperty

Entity Framework Core 中的關系始終有兩個端點。 每一端都必須傳回一個映射到關系另一端的導航屬性。 您可以從 Entity Framework Core 中的關系教程中了解它。 實體架構按照慣例檢測這種關系并建立适當的外鍵列。

考慮以下模型

public class Employee
{
  public int EmployeeID { get; set; }
  public string Name { get; set; }
 
  public int DepartmentID { get; set; }
  public Department Department { get; set; }
}
 
public class Department
{
  public int DepartmentID { get; set; }
  public string Name { get; set; }
 
  public virtual ICollection<Employee> Employees { get; set; }
}
           
EF Core 中的 InverseProperty 屬性

在上面的示例中,我們有屬于特定部門的員工。 預設約定會自動檢測關系并在 Employee 表中建立 DepartmentID 外鍵列。

多重關系

員工和部門是單一關系。 如果員工屬于多個部門怎麼辦? 讓我們以航班和機場為例。 從一個機場起飛并到達另一個機場的航班。 是以航班與機場有多重關系

public class Flight
    {
        public int FlightID { get; set; }
        public string Name { get; set; }
        public Airport DepartureAirport { get; set; }
        public Airport ArrivalAirport { get; set; }
    }
 
    public class Airport
    {
        public int AirportID { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Flight> DepartingFlights { get; set; }
        public virtual ICollection<Flight> ArrivingFlights { get; set; }
    }
           

DepartngFlights 屬性必須映射到機場模型中的 DepartureAirport 屬性,而 ArrivingFlights 屬性必須映射到 ArrivalAirport 屬性。

當我們運作遷移時,EF Core 抛出以下錯誤

無法确定由類型為“ICollection”的導航“Airport.DepartingFlights”表示的關系。 手動配置關系,或使用“[NotMapped]”屬性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此屬性。

使用InverseProperty

我們通過在關系的任何一側使用 InverseProperty 屬性來解決這個問題。 在該屬性上應用 InverseProperty 屬性。 指定關系另一端的相應導航屬性作為其參數。

應用 InverseProperty 後的 Airport 類如下所示。

public class Airport
{
  public int AirportID { get; set; }
  public string Name { get; set; }
 
  [InverseProperty("DepartureAirport")]
  public virtual ICollection<Flight> DepartingFlights { get; set; }
 
  [InverseProperty("ArrivalAirport")]
  public virtual ICollection<Flight> ArrivingFlights { get; set; }
}
           
EF Core 中的 InverseProperty 屬性

現在 EF Core 正确識别關系并僅建立兩個字段,如下圖所示。

EF Core 中的 InverseProperty 屬性

您可以在航班而不是機場上應用 InverseProperty,如下所示。 兩者都會産生相同的輸出

public class Flight
{
    public int FlightID { get; set; }
    public string Name { get; set; }
    [InverseProperty("DepartingFlights")]
    public Airport DepartureAirport { get; set; }
    [InverseProperty("ArrivingFlights")]
    public Airport ArrivalAirport { get; set; }
}           

繼續閱讀