我在尝试配置存在自引用的实体时遇到了一些问题。我的实体看起来大致如下:
public class MainEntity
{
public Guid Id {get; private set;}
...
public IReadOnlyList<Foo> Foos => _foos;
private readonly List<Foo> _foos {get; private set;} = new List<Foo>();
}
public class Foo
{
public Guid Id {get; private set;}
public Guid MainEntityId {get; private set;}
public IReadOnlyList<Bar> Bars => _bars;
private readonly List<Bar> _bars {get; private set;} = new List<Bar>();
}
public class Bar
{
public Guid Id {get; private set;}
public Guid? FooId {get; private set;}
public Guid? ParentBarId {get; private set;}
public IReadOnlyList<Bar> Bars => _bars;
private readonly List<Bar> _bars {get; private set;} = new List<Bar>();
}
基本上,MainEntity
包含了一个 Foos
列表,该列表包含一个 Bars
的列表,其中可能带有内部的 Bars
列表(您可以将 MainEntity 视为某个用户配置文件;Fools 为用户帖子列表;Bars 为某个帖子的评论或一些父级评论的回复)。
最初我认为一切都很好,但后来发现通过执行 context.MainEntities.Include(x => x.Foos).ThenInclude(x => x.Bars).First();
,我只得到了第一层 Bars(具有 FooId),而且某个 Bar 的 Bars 始终为空。
我可以多次使用 ThenInclude(x => x.Bars)
,但这并不是真正意义上的解决方法,因为最大深度没有限制,会影响检索性能。
我尝试将 Bar.FooId 设置为非空,并进行填充,但没有成功(context.SaveChangesAsync()
无法解决关系,可能是 ModelBuilder 中的配置错误)。另外,我不确定是否会导致其他问题,例如 Foo
包含所有具有 FooId
的 Bars
,即使 Bar
具有 ParentBar
也是如此...
有时我的解释可能会令人困惑,如果需要任何澄清,请告诉我。
context.MainEntities.Include(x => x.Foos).First()
然后context.Bars.Where(x => mainEntity.Foos.Select(xx => xx.Guid).Contains(x.Guid)).ToList()
但我认为这是一种hack方法,应该手动传递Guids。 - Kilas