【问题标题】:How do I specify the foreign key in a one-to-one/zero relationship?如何在一对一/零关系中指定外键?
【发布时间】:2017-03-27 17:38:29
【问题描述】:

我有一个父实体和一个子实体。

在数据库中,父级的主键是p_p_id 而且child里面的外键是一样的p_p_id

数据库中没有外键约束。

实体在各自的类中设置了属性,并相互指向。

父类

public virtual ChildProject ThisChildProject { get; set; }

儿童班

public virtual ParentProject ThisParentProjection { get; set; }

这些属性和任何一个类的 Id 上都没有注释。

在配置中,我尝试在孩子中进行映射。

HasRequired(i => i.ThisParentProject).WithOptional(o => o.ThisChildProject );

EF 会尝试使用子节点的主键和父节点的主键进行映射。

但我想在子级中使用定义的 FK 和父级的主键

【问题讨论】:

  • 你定义它的方式,不是one-to-many/zero,而是one-to-one/zero——EF 不太支持的关系之一。
  • 哦,废话。抱歉打错了。你是 100% 正确的

标签: c# entity-framework ef-fluent-api


【解决方案1】:

默认情况下,EF 使用所谓的Shared Primary Key Association,它使用依赖实体 PK 作为主体实体的 FK。

您可以通过 Map -> MapKey fluent 配置指定 hidden (shadow) FK 名称来覆盖该行为:

HasRequired(e => e.ThisParentProject)
   .WithOptional(e => e.ThisChildProject)
   .Map(m => m.MapKey("p_p_id"));

更新:请注意隐藏(阴影)字。 EF 不支持这种类型的关系的显式 FK 属性 - 没有 HasForeignKey fluent 方法并且放置 ForeignKey 属性会导致错误。因此,如果您的 ChildProject 课程中有类似的内容:

[Column("p_p_id")]
public int ThisParentProjectId { get; set; }

恐怕唯一的选择是删除它并只使用导航属性。

【讨论】:

  • 嗯。抛出以下异常p_p_id: Name: Each property name in a type must be unique. Property name 'p_p_id' is already defined.
  • 啊,所以你有 explicit FK 字段,例如public int p_p_id { get; set; }。这就是我在第一条评论中的意思 - 它不受支持(没有 HasForeignKey 方法),您应该删除显式字段并只保留导航属性。
  • 嗯。我必须定义映射,因为类中的属性与列的名称不同。
  • 没有。 Map 方法用于命名表示表列的隐藏属性。 HasKeyHasForeignKey 等带有 lambda 参数的方法用于映射类的现有属性。同样,这种关系不允许在类中具有表示 db 表 FK 列的原始(类似 id)属性。我已经多次与这个问题作斗争,所以除了牺牲一些东西之外没有其他解决方案。如果你问为什么,我不知道 - EF 团队的决定。
  • 谢谢。我得调查一下。我不确定拆除该物业是否是一个可行的选择。我可能不得不重新考虑设计。
【解决方案2】:

根据您的属性名称,您可能需要添加 ForeignKey 属性,但标准集合声明很好:

http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx

这里是您更新的问题所要求的一对一:

http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

【讨论】:

  • 当我尝试第二个选项时,我收到以下消息Multiplicity is not valid in Role '' in relationship ''. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be '*'.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 2020-07-02
  • 2017-10-08
  • 1970-01-01
相关资源
最近更新 更多