【发布时间】:2018-06-26 08:12:11
【问题描述】:
到目前为止,在我搜索过的每一个地方,实体框架中的所有一对一关系都有一个主体和一个依赖实体。我想要的是两个主要实体之间的一对一关系。
让我们设置一个示例。想象一下汽车发动机和汽车。汽车引擎可以没有汽车而存在,汽车也可以没有汽车引擎而存在。汽车引擎可以放置在汽车中(可选),而汽车可以在其中放置汽车引擎(可选)。当我有汽车引擎(如果有)时,我希望能够LoadAsync关联的汽车,当我有汽车(如果有)时,我希望能够关联汽车引擎。
如您所见,我无法使用主体和依赖实体来实现这一点。
实体应如下所示:
public class Car
{
[Key]
public string SN { get; set; }
public string Plate { get; set; }
public string IncludedEngineId { get; set; }
[ForeignKey("IncludedEngineId")]
public virtual Engine IncludedEngine { get; set; }
}
public class Engine
{
[Key]
public string SN { get; set; }
public int CC { get; set; }
public string PlacedInCarId { get; set; }
[ForeignKey("PlacedInCarId")]
public virtual Car PlacedInCar { get; set; }
}
如果我这样做,汽车 C1 可能有 IncludedEngineId E1,但 E1 可能是 PlacedInCarId C2!这不会在 C1 和 E1 之间创建“配对”。
有没有办法使用注释来实现这一点?如果没有,有没有办法使用流利的api?还是我必须将其作为业务逻辑来实现?
【问题讨论】:
-
通过说“汽车引擎”,您已经知道引擎依赖于汽车:)
-
汽车发动机可以和汽车分开销售,可以用来装饰,也可以从汽车上拆下来放在另一辆汽车上,或者去工厂修理。它是一个主体实体,恰好可以与一辆汽车配对。
-
啊我现在看清楚了。可能是一个连接表,将其命名为 EquipmentRelation,其中包含每件设备:Car 1---* EquipmentRelation * ---- 1 Engine。
-
我也想到了。 EquipmentRelation 可以有一个由两个外键组成的复合键,并将每个外键设置为唯一的,这似乎可以解决所有问题。我在想一个更简单的解决方案。也许某种注释指示实体框架为我做连接表。如果不是这种情况,那么您的解决方案就是下一个最好的选择。您应该将其发布为答案。
-
EF 将在构建模型时(在某些条件下)生成连接表,但最好是明确的。事实上,您已经建立了 1:0 关系(字符串键可以为空,因此 1 到 0 或 1),除非我错过了什么,否则您不应该得到重复的配对。你真的不应该使用用户输入作为主键,应该总是有一个代理主键。
标签: entity-framework one-to-one