EF Core 中的 InverseProperty 属性

文章讲述了在EntityFrameworkCore(EFCore)中,如何使用InverseProperty属性来处理和明确指定多重关系的导航属性。当默认约定无法识别复杂关系,如航班与机场的多重关联时,InverseProperty可以帮助EFCore正确识别并创建外键。示例展示了在Flight和Airport实体中应用InverseProperty的方法,以避免迁移时出现错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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; }
}

ForeignKey Default Convention in EF Core
在上面的示例中,我们有属于特定部门的员工。 默认约定会自动检测关系并在 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; }
}

Using Inverse Property in EF Core

现在 EF Core 正确识别关系并仅创建两个字段,如下图所示。
Handling Multiple Relationships using InverseProperty in Entity Framework Core
您可以在航班而不是机场上应用 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; }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值