映射 1-0..1 与导航的关系 属性 无 FK

Mapping 1-0..1 Relationship with Navigation Property Without FK

我有 2 个实体,它们之间的关系为 1-0..1,但对生成的数据库模式的外观有限制。

所以 1 个车辆到 0 个或 1 个 RecVehicle 实体

我需要能够进行从 Vehicle 到 RecVehicle 的导航 属性,但没有 Vehicles table 具有到 RecVehicle 的 FK 的 DB 架构。 RecVehicle 的 PK table 应该是它所关联的 Vehicle 实体的 Id。

我们首先使用 EF 代码

public class Vehicle
{
    [Key]
    public int Id { get; set; }
    
    public virtual RecVehicle RecVehicle { get; set; } // Need to be able to use as navigation
}
public class RecVehicle
{
    [Key]
    public int VehicleId { get; set; }
    
    [ForeignKey("VehicleId")]
    public Vehicle Vehicle { get; set; }
}

生成的架构需要是这样的:

车辆 [ Id(int, pk, not null), ...] <-- RecVehicles 没有 FK 列

RecVehicles [ VehicleId(int, pk, fk, not null), ...]

原来我试过这样的东西:

public class Vehicle
{
    [Key]
    public int Id { get; set; }

    [InverseProperty("Vehicle")]
    public virtual RecVehicle RecVehicle { get; set; } // Need to be able to use as navigation
}

但这会导致此异常:

Unable to determine the principal end of an association between the types 'Contract.Entities.Vehicle' and 'Contract.Entities.RecVehicle'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.

我不确定要设置什么流畅的 API 关系才能使这项工作正常进行,也不确定要设置哪些正确的数据注释才能使这项工作正常进行,或者是否有可能。

推理

RecVehicle 可以连接到多个 Vehicle

可以试试下面的导航吗属性?

public virtual ICollection<RecVehicle> RecVehicle { get; set; }

而不是

public virtual RecVehicle RecVehicle { get; set; }

由于 RecVehicle 主键这个列表最多只包含一个元素

最终能够让这种关系像这样工作:

public class Vehicle
{
    [Key]
    public int Id { get; set; }
    
    public virtual RecVehicle RecVehicle { get; set; }
}
public class RecVehicle
{
    [Key]
    public int VehicleId { get; set; }
    
    [ForeignKey("VehicleId"), Required] //<--- Required attr fixed the principal/dependent confusion EF was having
    public virtual Vehicle Vehicle { get; set; }
}