【问题标题】:Entity framework code first one-to-one two way navigation实体框架代码先一对一双向导航
【发布时间】: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


【解决方案1】:

似乎这是两个表之间的一种循环引用,希望 EF 不支持此功能。要么您必须为两者创建单独的表,要么为此进行编码。

【讨论】:

  • 如果关系不是可选的,这将是一个循环引用问题。如果其中一个不是可选的,这将是一个依赖于委托人的实体问题。这些都不适用于我的情况。
猜你喜欢
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
相关资源
最近更新 更多