防止一对多关系中的额外外键列

Prevent extra foreign key columns in One to Many relationship

我正在尝试弄清楚如何配置 EF 以处理以下涉及一个 parent 和多个 children:

的情况
public class Parent
{
    public int ParentId {get; set;}

    [ForeignKey("SpecialChildOneId")]
    public virtual Child SpecialChildOne {get; set;}
    public int? SpecialChildOneId {get; set;}

    [ForeignKey("SpecialChildTwoId")]
    public virtual Child SpecialChildTwo {get; set;}
    public int? SpecialChildTwoId {get; set;}

    public virtual ICollection<Child> Children {get; set;}
}

public class Child
{
    public int ChildId {get; set;}
    public int ParentId {get; set;}
}

为我的 parent class 生成的 table 看起来不错。在我的 child table 上,尽管我添加了两个额外的列,Parent_ParentId 和 Parent_ParentId1,并且没有在 ParentId 上设置外键。

如何强制 ParentId 成为 Child table 上的唯一外键并防止添加其他外键?

要解决此问题,您可以这样做:

public class Child
{
   public int ChildId {get; set;}
   [ForeignKey("Parent")]
   public int ParentId {get; set;}
   public virtual Parent Parent{get;set;}
}

这样,涉及子集合的关系与 ParentId FK 属性 相关联(这是创建 Parent_ParentId1 FK 列的关系)。

现在,您可能认为您有两个一对一关系和一个一对多关系,但事实并非如此,您实际上有三个一对多关系(前两个是单向的导航)。如果您使用 Fluent Api 配置这些关系,它将是这样的:

  modelBuilder.Entity<Parent>()
              .HasOptional(p=> p.SpecialChildOne )
              .WithMany()
              .HasForeignKey(p=> p.SpecialChildOneId );

  modelBuilder.Entity<Parent>()
              .HasOptional(p=> p.SpecialChildTwo )
              .WithMany()
              .HasForeignKey(p=> p.SpecialChildTwoId );

  modelBuilder.Entity<Child>()
              .HasRequired(c=> c.Parent)
              .WithMany(p=>p.Children)
              .HasForeignKey(p=> p.ParentId);

但对于您可能正在寻找的逻辑,此模型应该有效。