实体框架核心闭包表(Code First)

问题描述 投票:0回答:1

我已经搜索出互联网来创建一个表来支持树数据或层次结构数据,但似乎没有提供太多信息。

假设我希望有一个位置表,如果有其他位置数据的父节点,它可以自引用。

如何在ef-core中实现以下查询?

  1. 列出根目录中的所有位置项(dept = 0)
  2. 列出所有位置层次结构例如..
  • 位置A. 位置B. 位置C.
  • 位置D. 位置E. 位置J. 位置F. 位置K. 位置L.
  • 位置M.
  1. 列出所选节点下的所有子位置,并更喜欢dept级别(ex 1,2或其余)。
  2. 列出所选节点下的所有父位置,并选择dept级别(ex 1,2或其余)。

这是我的位置模型......

public class Location
{
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    public string Address { get; set; }

    public NpgsqlTsVector SearchVector { get; set; }
}

请帮助或给任何建议资源开始会很好。我是dotnet核心和实体框架的新手。

谢谢。

c# .net-core ef-code-first entity-framework-core ef-core-2.2
1个回答
0
投票

你想要的实体似乎是这样的:

public class Location
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public string Address { get; set; }
    public NpgsqlTsVector SearchVector { get; set; }
    public int? ParentId { get; set; }
    public Location Parent { get; set; }
}

?ParentId是因为你的根没有任何父母。因此,根(或可能是根)是没有任何ParentId的那个,并且树的其他部分可以由他们的ParentIds确定。

Update:

关于第二个问题,如果要读取具有层次结构的数据,还需要将另一个属性添加到实体:

public virtual List<Location> Children { get; set; }

使用以下配置:

HasMany(c => c.Children).WithOptional(c => c.Parent).HasForeignKey(c => c.ParentId);

因此,使用上面的实体,只需执行db.Location.toList();您将获得所需的输出。

© www.soinside.com 2019 - 2024. All rights reserved.