实体框架自我加入

use*_*714 5 c# entity-framework

我正在使用Code First的Entity Framework 6,我有一个具有以下结构的表:

public class Item
{
    [Key]
    public int ItemId { get; set; }

    [Required]
    [MaxLength(255)]
    public string Name { get; set; }}

    public Item Parent { get; set; }
    public virtual List<Item> Children { get; set; }       
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以进行单个查询/数据库访问,Items直到我的树,直到根,提供itemIdas参数.

例如,给我ItemId55岁以上的所有父母,直到找不到父母.

dan*_*wig 0

您无法使用任何健全的代码让所有父母参与一次旅行。

但是你可以这样做:/sf/answers/809609881/

通过稍微修改您的实体,您可以添加 2 个派生集合:

public class Item
{
    [Key]
    public int ItemId { get; set; }

    [Required]
    [MaxLength(255)]
    public string Name { get; set; }}

    public virtual Item Parent { get; set; } // be sure to make this virtual
    public virtual List<Item> Children { get; set; }

    public virtual ICollection<ItemNode> Ancestors { get; set; }
    public virtual ICollection<ItemNode> Offspring { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

不过,您确实需要引入一个新实体才能完成这项工作,如下所示:

public class ItemNode
{
    public int AncestorId { get; set; }
    public virtual Item Ancestor { get; set; }

    public int OffspringId { get; set; }
    public virtual Item Offspring { get; set; }

    public int Separation { get; set; } // optional
}
Run Code Online (Sandbox Code Playgroud)

现在,如果你想要

从 ItemId 55 开始的所有父项,直到找不到父项

...你可以这样做:

IEnumerable<Item> allParentsFrom55 = dbContext.Set<Item>()
    .Find(55).Ancestors.Select(x => x.Ancestor);
Run Code Online (Sandbox Code Playgroud)