I have Person and Address. Address is optional. Please see below code
class Person
{
[Key]
public int PersonID { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
class Address
{
[Key, ForeignKey("Person")]
public int PersonID { get; set; }
public string City { get; set; }
}
Registration code is below:
modelBuilder.Entity<Address>(entity =>
{
entity.HasKey(z => z.PersonID);
entity.HasOne(p => p.Person)
.WithOne(a => a.Address)
.HasForeignKey<Person>(a => a.PersonId);
});
How should i change mapping to make Address optionable?
Here
you are telling EF that
Person.PersonId
will be a FK (foreign key) toAddress
, i.e.Person
is dependent and is referencing the principalAddress
.It should be other way around:
This way,
Person
(the principal) will have 0..1Address
, andAddress
(the dependent) will have 1Person
(because thePersionId
is both PK and FK).This is called Shared Primary Key association and is the standard (and default) way of modelling one to zero or one relationship in EF Core.
For more info, see Relationships.