我有一个父实体和一个子实体。
在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和父节点的主键
答案 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属性,但标准集合声明很好:
根据您更新的问题,这是One-One: