我有数据库与翻译词典.它有"词"和"译"两个实体.每个翻译都链接到一个"源"字和一个"目标"字--例如,我可以用"cat"(英语)和"Kot"(波兰语)进行翻译,意思是"cat"翻译为"Kot","Kot"翻译为"cat".
当在词典中搜索给定的短语(例如"cat ")时,我想为这个短语和它被翻译成的所有单词获取Word
个实体.因此,我开始的查询如下所示:
Word[] words = ctx.Words
.Include(it => it.TranslationSrcWords)
.ThenInclude(it => it.SrcWord)
.Include(it => it.TranslationDstWords)
.ThenInclude(it => it.DstWord)
...
对于这样的代码,我得到了错误:
实体框架核心将自动修复先前加载到上下文实例中的任何其他实体的导航属性.
当然,上面的查询将导致单词重复--从开头(ctx.Words
)取回一个,然后从SrcWord
或DstWord
取回(翻译的一侧必须指向要找到的单词).
EF"优化"迫使我要么隐藏错误,要么注释掉嵌套的INCLUDE--在这两种情况下,它都会导致部分提取.例如,当我查找"cat "而不是得到如下翻译时:
("cat", "kot")
我得到的翻译如下:
("cat", null)
"cat"实际上是由EF和null
修复的,因为我不得不跳过嵌套的INCLUDE,所以根本没有数据.
如何解决,即一次取数?
Full repo is here: 100 Simplified models:
public sealed class Word
{
public long Id { get; set; }
public string Phrase { get; set; } = null!;
public ICollection<Translation> TranslationDstWords { get; set; } = default!;
public ICollection<Translation> TranslationSrcWords { get; set; } = default!;
}
public sealed class Translation
{
public long Id { get; set; }
public long SrcWordId { get; set; }
public long DstWordId { get; set; }
public Word DstWord { get; set; } = null!;
public Word SrcWord { get; set; } = null!;
}