映射 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 关系才能使这项工作正常进行,也不确定要设置哪些正确的数据注释才能使这项工作正常进行,或者是否有可能。
推理
- 对数据库模式有严格限制的原因是我们的数据团队有一个我们无法更改的 migration/data 导入过程
- 我们有一个现有的代码库,在许多地方(2 个团队,在架构中不同步)使用导航 属性,因此更改为在代码中使用查找需要对我们正在尝试的代码库进行许多更改避免。
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; }
}
我有 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 关系才能使这项工作正常进行,也不确定要设置哪些正确的数据注释才能使这项工作正常进行,或者是否有可能。
推理
- 对数据库模式有严格限制的原因是我们的数据团队有一个我们无法更改的 migration/data 导入过程
- 我们有一个现有的代码库,在许多地方(2 个团队,在架构中不同步)使用导航 属性,因此更改为在代码中使用查找需要对我们正在尝试的代码库进行许多更改避免。
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; }
}