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.

Galdin Raphael

Galdin Raphael is an independent full stack developer from Mumbai.

Subscribe to Galdin's Blog

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!