EF核心一对一或零关系

Sia*_*huk 5 entity-framework-core .net-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; }
}
Run Code Online (Sandbox Code Playgroud)

注册代码如下:

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

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

Iva*_*oev 7

这里

.HasForeignKey<Person>(a => a.PersonId)
Run Code Online (Sandbox Code Playgroud)

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

应该是相反的方式:

.HasForeignKey<Address>(a => a.PersonId)
Run Code Online (Sandbox Code Playgroud)

这样,Person(委托人)将具有0..1 Address,而Address(从属人)将具有1 Person(因为PersionIdPK和FK均是)。

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

有关更多信息,请参见关系

  • @ttugates 不,这两个导航属性都不是强制性的。如果 `Address` 没有 `Person` 导航属性,流畅的调用将是 `entity.HasOne&lt;Person&gt;()` (3认同)