【发布时间】:2021-07-06 21:47:08
【问题描述】:
在尝试为具有单个一对一关系以及与同一实体的一对多关系的属性配置 Fluent API 时,我遇到了间接问题。例如:
public class Person
{
public int Id { get; set; }
public int PrimaryNameId { get; set; }
public NameInfo PrimaryName { get; set; } // one-to-one
public IList<NameInfo> Names { get; set; } // one-to-many
}
public class NameInfo
{
public int Id { get; set; }
public int PersonId { get; set; }
public Person Person { get; set; }
public string Name { get; set; }
...
}
我试图捕捉一个人可以有多个名字的关系,但在大多数情况下,我只对他们的“PrimaryName”感兴趣。 我希望在 IsPrimary 的 NameInfo 表上没有悬挂列。对于 >90% 的记录,该列最终将为 NULL/FALSE。
当我尝试为此手动配置 Fluent API 时
**Configuration on Person Entity**
builder.HasOne(c => c.PrimaryName)
.WithOne()
.HasForeignKey<Person>(c => c.PrimaryNameId)
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
builder.HasMany(c => c.Names)
.WithOne(n => n.Person)
.HasForeignKey(n => n.PersonId);
似乎存在相互指向的外部索引键约束,从而导致数据库播种失败。为了添加 NameInfo,我需要 PersonId - 但为了添加 Person,我需要现有 NameInfo Id(用于所需的 PrimaryNameId -> Primary Name)。
【问题讨论】:
标签: c# .net entity-framework entity-framework-core .net-5