实体框架自联接

本文关键字:框架 实体 | 更新日期: 2023-09-27 18:34:15

我正在使用带有代码优先的实体框架 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作为参数。

例如,从55 ItemId到找不到父母为止,给我所有父母。

实体框架自联接

你不能使用任何理智的代码在一次旅行中得到所有的父母。

但是,您可以执行以下操作: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);