如何以一对一/零关系指定外键?

Sme*_*egs 6 c# entity-framework ef-fluent-api

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

在数据库中,父级的主键是p_p_id ,子级中的外键是相同的p_p_id

数据库中没有外键约束。

实体具有在各自的类中设置的指向彼此的属性。

家长班

public virtual ChildProject ThisChildProject { get; set; }
Run Code Online (Sandbox Code Playgroud)

儿童班

public virtual ParentProject ThisParentProjection { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

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

HasRequired(i => i.ThisParentProject).WithOptional(o => o.ThisChildProject );
Run Code Online (Sandbox Code Playgroud)

发生的情况是EF尝试使用子级的主键和父级的主键进行映射。

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

Iva*_*oev 7

默认情况下,EF使用所谓的共享主键关联,该将依赖实体PK用作主体实体的FK。

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

HasRequired(e => e.ThisParentProject)
   .WithOptional(e => e.ThisChildProject)
   .Map(m => m.MapKey("p_p_id"));
Run Code Online (Sandbox Code Playgroud)

更新:请注意隐藏(阴影)词。EF不支持这种类型的关系的显式FK属性-没有HasForeignKey流畅的方法,而put ForeignKey属性会导致错误。因此,如果您在ChildProject课堂上有这样的事情:

[Column("p_p_id")]
public int ThisParentProjectId { get; set; }
Run Code Online (Sandbox Code Playgroud)

恐怕唯一的选择是将其删除并仅与导航属性一起使用。