实体框架自连接

5

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

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

我想知道是否有可能在单个查询/操作中获取树中所有 Item 直到根节点的内容,并提供 itemId 作为参数。

例如:给我从 ItemId 55 的所有父级,直到找不到父级为止。


3
我不认为这是可能的。可能需要使用存储过程和递归CTE进行映射。 - GraemeMiller
在这里回应@GraemeMiller:最近我也不得不做类似的事情,这就是我最终完成它的方式。 - Corey Adler
1个回答

0

使用任何合理的代码都无法一次获取所有父级。

但是,您可以尝试以下方法:https://dev59.com/QWgu5IYBdhLWcg3wHjl7#11565855

通过稍微修改实体,您可以添加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; }
}

尽管如此,您确实需要引入一个新的实体使其正常工作,它看起来像这样:

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
}

现在,如果你想要

所有从ItemId 55开始的父级元素,直到没有父级元素为止

...你可以像这样做:

IEnumerable<Item> allParentsFrom55 = dbContext.Set<Item>()
    .Find(55).Ancestors.Select(x => x.Ancestor);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接