实体框架自我加入

时间:2014-12-15 20:28:19

标签: 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; }       
}

我想知道是否有可能在数据库中进行单个查询/旅行,在我的树中全部Items直到根,提供itemId作为参数。< / p>

例如,在ItemId 55之前给我所有父母,直到找不到父母。

1 个答案:

答案 0 :(得分:0)

你无法使用任何合理的代码在一次旅行中获得所有父母。

但是你可以这样做:https://stackoverflow.com/a/11565855/304832

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