如何使用 Entity Framework 内核为 parent-tree 设计建模?

How to model a parent-tree design using Entity Framework Core?

我的目标是在财务报告的下拉列表中以树状格式列出具有 parent 个办公室的办公室。我将 .NET Core 2.1 与 Entity Framework 核心一起使用,数据通过 Web API 公开。

我要的结果:

A
 A1
 A2
   A2A
B
 B1
  B1A
 B2

这是我当前的模型:

public class OfficeSymbol
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public bool Inactive { get; set; }
    public int ParentId { get; set; }
    [Required]
    public int Level { get; set; }
}

我试图使用 int Level 来确定 child 的嵌套深度。

我还尝试了以下方法以及 Cascade.NoAction,但 Entity Framework 不允许键约束:

public class OfficeSymbol
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public bool Inactive { get; set; }
    public int ParentId { get; set; }
    [Required]
    public int Level { get; set; }
    [ForeignKey("ParentId")]
    public OfficeSymbol Parent { get; set; }
    [InverseProperty("Parent")]
    public ICollection<OfficeSymbol> Children { get; set; }
}

如有任何帮助,我们将不胜感激。

不幸的是,EF Core 无法将第一个 table 样本中的现有 table 调整为第二个 table 样本。我创建了一个新的对象模型并按此方式制作。

public class Office
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public bool Inactive { get; set; }
    public int? ParentId { get; set; }
    [ForeignKey("ParentId")]
    public OfficeSymbol Parent { get; set; }
    [InverseProperty("Parent")]
    public ICollection<OfficeSymbol> Children { get; set; }
}

我现在要返回并将我的代码修改为新对象。它主要是查找替换,但我正在修改一些调用。

这在 SQL 中正确构建,并确保 parentId 对于根级对象可为空。