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

时间:2017-03-27 17:38:30

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

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

在DB中,父级的主键是p_p_id 并且子项中的外键是相同的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和父节点的主键

2 个答案:

答案 0 :(得分:5)

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

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

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

更新:请注意隐藏(阴影)字样。 EF不支持此类关系的显式FK属性 - 没有HasForeignKey流畅的方法,并且ForeignKey属性导致错误。所以,如果你在ChildProject课程中有类似的内容:

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

我担心唯一的选择是删除它并仅使用导航属性。

答案 1 :(得分:0)

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

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

根据您更新的问题,这是One-One:

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