EF核心一对一或零关系

时间:2019-03-04 14:14:19

标签: .net-core entity-framework-core ef-core-2.2

我有个人和地址。地址是可选的。 请参见下面的代码

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; }
}

注册代码如下:

modelBuilder.Entity<Address>(entity =>
            {
                entity.HasKey(z => z.PersonID);
                entity.HasOne(p => p.Person)
                     .WithOne(a => a.Address)
                     .HasForeignKey<Person>(a => a.PersonId);
            });

我应该如何更改映射以使地址可选?

1 个答案:

答案 0 :(得分:3)

这里

.HasForeignKey<Person>(a => a.PersonId)

您告诉EF Person.PersonId将是Address的FK(外键),即Person是从属的,并且引用了主体Address

应该是相反的方式:

.HasForeignKey<Address>(a => a.PersonId)

这样,Person(委托人)将具有0..1 Address,而Address(委托人)将具有1 Person(因为{{ 1}}是PK和FK)。

这称为共享主键关联,它是在EF Core中为一对零或一个关系建模的标准(默认方法)。

有关更多信息,请参见Relationships