EF Core 中的 InverseProperty 属性

EF Core 中的 InverseProperty 属性DepartngFlights 属性必须映射到机场模型中的 DepartureAirport 属性,而 ArrivingFlights 属性必须

大家好,欢迎来到IT知识分享网。

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/78662.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信