【问题标题】:Prevent extra foreign key columns in One to Many relationship防止一对多关系中的额外外键列
【发布时间】:2015-06-08 20:41:11
【问题描述】:

我正在尝试弄清楚如何配置 EF 来处理以下涉及一个父母和多个孩子的情况:

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_ParentId 和 Parent_ParentId1,但 ParentId 上没有设置外键。

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

【问题讨论】:

    标签: c# entity-framework ef-code-first entity-framework-6 one-to-many


    【解决方案1】:

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

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

    但是对于您可能正在寻找的逻辑,这个模型应该可以工作。

    【讨论】:

    • 这几乎是完美的。唯一的问题是创建一个 Child 对象并将其分配给 parent.SpecialChildOne 不会分配 child.ParentId 外键。我还必须将孩子添加到 parent.Children 集合中才能分配外键。
    • 您好@Brian,当您设置SpecialChildOne 导航时。属性,要设置的 FK 属性是SpecialChildOneId。 FK ParentId 属性属于另一个关系,因此在您将子项添加到其父项中的集合之前,该属性不会更改其值(检查最后的 Fluent Api 配置)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多