【问题标题】:EF Core One to One or Zero RelationshipEF Core 一对一或零关系
【发布时间】:2019-07-25 20:54:31
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    这里

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

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

    应该是其他方式:

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

    这样,Person(主体)将有 0..1 个AddressAddress(从属)将有 1 个Person(因为PersonId 既是 PK 也是 FK)。

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

    有关详细信息,请参阅Relationships

    【讨论】:

    • 非常感谢!
    • 您能否澄清一下,此外,OP 还需要在 class Address 上指定 public Person Person { get; set; } 是否正确? - 否则将无法具体指定entity.HasOne(p =&gt; p.Person)
    • @ttugates 不,导航属性都不是强制性的。如果Address 没有Person 导航属性,则流畅调用将是entity.HasOne&lt;Person&gt;()
    • 我对这个答案有点困惑。看起来这将是 1..1 关系,而不是 1..0,1。是什么让它“可选”?
    • @JasonDWilson “可选”是依赖者,即没有地址的人。一般来说,这取决于您所关注的关系的哪一方。从人是 1 到 0..1 地址。从地址是1..1(地址需要人)
    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2019-06-27
    • 2018-07-01
    • 2017-10-26
    • 1970-01-01
    相关资源
    最近更新 更多