我似乎有许多关于一对一映射的类似问题,但我仍然坚持这个特殊情况。
考虑以下因素:
// model
class Parent
{
public int ParentId { get; set; }
// children
public virtual ICollection<Child> Children { get; set; };
// active child
public int ActiveChildId { get; set; }
public virtual Child ActiveChild { get;set; }
}
class Child
{
public int ChildId { get; set; }
public int ParentId { get; set; }
public virtual Parent Parent { get; set; }
}
所以父母有一个子实体的集合,但它的子节点也有一个FK。问题是我找不到告诉EF6流畅的API来映射Parent.ActiveChild
属性以使用Parent.ActiveChildId
外键的方法。
// map
class ParentMap : EntityTypeConfiguration<Parent>
{
public ParentMap()
{
// parent <>=== children
HasMany(parent => parent.Children)
.WithRequired(child => child.Parent)
.HasForeignKey(child => child.ParentId);
// parent ---> child
HasOptional(parent => parent.ActiveChild) // ???? no way to tell EF to use IdActiveChild as FK for this property.
}
}
答案 0 :(得分:1)
首先,您需要使您的id属性可选:
public int? ActiveChildId { get; set; }
如果您使用默认约定,这将有效。在您的情况下,使用地图时,HasForeignKey
不适用于可选关系。您可以使用HasMany
方法解决此问题,而不指定另一方,如下所示:
HasOptional(parent => parent.ActiveChild)
.WithMany()
.HasForeignKey(parent => parent.ActiveChildId)
有关更多背景信息,请在此处查看完整说明: http://patrickdesjardins.com/blog/how-to-setup-entity-framework-code-first-to-have-only-one-side-0-to-1-relationship