如何在 one-to-one/zero 关系中指定外键?

How do I specify the foreign key in a one-to-one/zero relationship?

我有一个 parent 实体和一个 child 实体。

在数据库中 parent 的主键是 p_p_id 并且 child 中的外键是相同的 p_p_id

数据库中没有外键约束。

实体在各自的 classes 中设置了指向彼此的属性。

Parent Class

public virtual ChildProject ThisChildProject { get; set; }

Child Class

public virtual ParentProject ThisParentProjection { get; set; }

这些属性和 class 的 ID 都没有注释。

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

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

EF 尝试使用 child 的主键和 parent 的主键进行映射。

但是我想在child中使用定义的外键和parent

中的主键

根据您的 属性 名称,您可能需要添加 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

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

您可以通过 Map -> MapKey 流畅配置指定 隐藏(阴影) FK 名称来覆盖该行为:

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

更新:请注意隐藏(影子)字。对于这种类型的关系,EF 不支持显式 FK 属性 - 没有 HasForeignKey 流畅的方法并且放置 ForeignKey 属性会导致错误。因此,如果您的 ChildProject class:

中有这样的内容
[Column("p_p_id")]
public int ThisParentProjectId { get; set; }

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