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

时间:2015-04-03 18:17:41

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

我试图弄清楚如何配置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表中唯一的外键并阻止添加其他外键?

1 个答案:

答案 0 :(得分:2)

要解决此问题,您可以执行以下操作:

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

但是对于你可能正在寻找的逻辑,这个模型应该有用。