EF 0..1 relationships

It's the second time I'm seeing the following error this week and I thought I should document it:

B_A_Source: Multiplicity is not valid in Role 'B_A_Source' in relationship 'B_A'. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be '*'.

I got the above error while adding an EF migration for the following models:

public class A
{
    public int Id { get; set; }
    public string SomeField { get; set; }
    public virtual B B { get; set; }
}

public class B
{
    public int Id { get; set; }
    [ForeignKey("A")]
    public int? AId { get; set; }
    public virtual A A { get; set; }
}

In the above example, A and B are in a one-to-many relationship. So the navigation property in A should be udpated to public virtual ICollection<B> Bs { get; set; }.

However what I actually intended to do was have a one to zero-or-one relationship between B and A. So the proper fix would be to make B the parent and A the child. Or in EF terms, make B the principal end and A the dependent end.

public class B
{
    public int Id { get; set; }
    public virtual A A { get; set; }
}

public class A
{
    [Key, ForeignKey("B")]
    public int Id { get; set; }
    public string SomeField { get; set; }
    public virtual B B { get; set; }
}

Whenever a one-to-one (or a one to zero-or-one) relationship is desired the dependent end's foreign key should be its primary key as well.

Oh and BTW, a pure one-to-one relationship doesn't really exist.


Update Oct 2017: Here's a related post I wrote this Valentines day: Notes on database relationships.