FK 相同 Table 代码优先 Entity Framework

FK to the Same Table Code First Entity Framework

我是 Entity Framework 中代码优先方法的新手。我对如何做到这一点感到有点困惑:

我需要与相同的 FK 关系 table,这样我就可以在元素之间建立父 --> 子关系。

这是Table的型号:

public class BucketGroup
{
   public int Id {get;set;} // This is the PK in the Table

   public string Name {get;set;}


   // Now this the FK, to this Same Table:
  public int? BucketGroupId {get;set;}

}

所以我将这个项目设置为 Nullable,如果 BucketGroupId 是 NULL 那么我知道它是一个父项目。

我创建了一个测试项目并使用数据库优先,模型是这样的:

public partial class Testing
{
    public Testing()
    {
        this.Testing1 = new HashSet<Testing>();
    }

    public int Id { get; set; }
    public Nullable<int> ParentId { get; set; }

    public virtual ICollection<Testing> Testing1 { get; set; }
    public virtual Testing Testing2 { get; set; }
}

因此,如果我向我的模型添加一个类似的 属性 是否会使它成为 PK ID 的 FK

public class BucketGroup
{
  public int Id {get;set;} // This is the PK in the Table

  public string Name {get;set;}


  // Now this the FK, to this Same Table:
  public int? BucketGroupId {get;set;}

  public virtual ICollection<BucketGroup> BucketGroup1 { get; set; }

}

这是正确的吗?

您有两种选择:

  • 使用Data Annotations:

    public class BucketGroup
    {
      public int Id {get;set;} 
    
      public string Name {get;set;}
    
      [ForeignKey("ParentBucketGroup")]
      public int? ParentBucketGroupId {get;set;}
    
      public virtual BucketGroup ParentBucketGroup {get;set;}
    
      public virtual ICollection<BucketGroup> Children { get; set; }
    }
    

    或者,使用 Fluent Api:

    public class BucketGroup
    {
      public int Id {get;set;} 
    
      public string Name {get;set;}
    
      public int? ParentBucketGroupId {get;set;}
    
      public virtual BucketGroup ParentBucketGroup {get;set;}
    
      public virtual ICollection<BucketGroup> Children { get; set; }
    }
    

    并且,要配置关系,您可以在上下文中覆盖 OnModelCreating 方法:

    modelbuilder.Entity<BucketGroup>().HasOptional(b=>b.ParentBucketGroup )
                                      .WithMany(b=>b.Children )
                                      .HasForeignKey(b=>b.ParentBucketGroupId);
    

更新

如果需要,您可以使用单向(也称为单向)关系,但您需要保留其中之一。

如果您删除 Children 导航 属性,那么,您的配置将是这样的:

 modelbuilder.Entity<BucketGroup>().HasOptional(b=>b.ParentBucketGroup)
                                   .WithMany()
                                   .HasForeignKey(b=>b.ParentBucketGroupId);

或者,如果您删除 ParentBuketGroup 导航。 属性,那么你需要这样做:

 modelbuilder.Entity<BucketGroup>().HasOptional()
                                   .WithMany(b=>b.Children)
                                   .HasForeignKey(b=>b.ParentBucketGroupId);