如何以一对一/零关系指定外键?
我有一个父实体和一个子实体。
在DB中,父级的主键是p_p_id
,子级中的外键是相同的p_p_id
数据库中没有外键约束。
实体具有在各自的类中相互指向的属性。
家长class
public virtual ChildProject ThisChildProject { get; set; }
儿童class
public virtual ParentProject ThisParentProjection { get; set; }
这些属性上没有注释,也没有任何类的ID。
在配置中,我试图在孩子中进行映射。
HasRequired(i => i.ThisParentProject).WithOptional(o => o.ThisChildProject );
EF会尝试使用子键的主键和父键的主键进行映射。
但是我想在子节点中使用已定义的FK和父节点的主键
默认情况下,EF使用所谓的共享主密钥关联 ,它将依赖实体PK用作主体实体的FK。
您可以通过Map
– > MapKey
fluent配置指定隐藏(阴影) FK名称来覆盖该行为:
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; }
我担心唯一的选择是删除它并仅使用导航属性。
根据您的属性名称,您可能需要添加ForeignKey属性,但标准集合声明很好:
根据您更新的问题,这里是One-One: