在EF6 Code-first中映射可选的一对一

时间:2015-08-04 12:12:42

标签: entity-framework

我似乎有许多关于一对一映射的类似问题,但我仍然坚持这个特殊情况。

考虑以下因素:

// 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.
    }
}

1 个答案:

答案 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