微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决映射 1-0..1 与没有 FK 的导航属性的关系

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

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

我需要能够拥有从 Vehicle 到 RecVehicle 的导航属性,但没有 Vehicles 表的 DB Schema 具有到 RecVehicle 的 FK。 RecVehicle表的PK应该是它关联的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 [ VehicleId(int,fk,...]

最初我尝试过这样的事情:

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
}

但这会导致此异常:

无法确定类型“Contract.Entities.Vehicle”和“Contract.Entities.RecVehicle”之间关联的主要端。必须使用关系流畅 API 或数据注释显式配置此关联的主体端。

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

推理

  • 数据库架构有严格限制的原因是我们的数据团队有一个我们无法更改的迁移/数据导入流程
  • 我们现有的代码库在许多地方使用导航属性(2 个团队,在架构中不同步),因此更改为在代码中使用查找需要对代码库进行许多我们试图避免的更改。

解决方法

RecVehicle 可以连接多辆车

您可以尝试以下导航属性吗?

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。