Entity Framework Core Eager Loading 然后包含在集合中
Posted
技术标签:
【中文标题】Entity Framework Core Eager Loading 然后包含在集合中【英文标题】:Entity Framework Core Eager Loading Then Include on a collection 【发布时间】:2016-10-28 21:45:08 【问题描述】:在执行查询时,我想包含三个模型。
这里是场景。
public class Sale
public int Id get; set;
public List<SaleNote> SaleNotes get; set;
public class SaleNote
public int Id get; set;
public User User get; set;
public class User
public int Id get; set;
我可以像这样急切地加载 SaleNotes...
_dbContext.Sale.Include(s => s.SaleNotes);
但是,尝试使用 ThenInclude 从 SaleNote 中预加载 User 模型具有挑战性,因为它是一个集合。我找不到任何关于如何急切加载此场景的示例。有人可以提供以下 ThenInclude 中的代码来为集合中的每个项目加载用户。
_dbContext.Sale.Include(s => s.SaleNotes).ThenInclude(...);
【问题讨论】:
【参考方案1】:SaleNotes
是集合导航属性并不重要。它应该对引用和集合起作用:
_dbContext.Sale.Include(s => s.SaleNotes).ThenInclude(sn=>sn.User);
但据我所知,EF7 还支持使用 Select 扩展方法的旧的多级 Include 语法:
_dbContext.Sale.Include(s => s.SaleNotes.Select(sn=>sn.User));
【讨论】:
感谢您的回答。我实际上发现虽然用户没有出现在智能感知中,但我添加了 sn.User,构建了我的解决方案,它运行了!智能感知将 lambda 表达式中的 SaleNotes“sn”视为一个集合,因此它没有显示 User 类的各个属性。 @AllenRufolo 有两个重载,一个为您提供整个列表(第一个和默认值),另一个为您提供列表中的每个项目(第二个) - 所以,如果你只是在智能感知中执行“向下箭头”,您将看到预期的智能感知选项。我自己也有同样的困惑:-) 艾伦,你是绝对正确的。我在 VS 2017 15.4 上使用 EF Core 2.0 并且 intelliesense 无法正常工作,但如果您只输入所需的属性名称,就可以了。这帮了我很多忙。 @AllenRufolo 感谢您对未在智能感知中显示的评论。这是疯狂的错误!你为我节省了很多精力!我永远不会猜到智能感知在这里可能不起作用。 @AllenRufolo 我希望他们能做到。我今天提交了一个错误。这是讨厌的一个:)。【参考方案2】:作为参考,最新版本(发布时)EF Core 1.1.0 也支持此场景的显式加载。像这样的……
using (var _dbContext = new DbContext())
var sale = _dbContext.Sale
.Single(s => s.Id == 1);
_dbContext.Entry(sale)
.Collection(n => n.SalesNotes)
.Load();
_dbContext.Entry(sale)
.Reference(u => u.User)
.Load();
【讨论】:
以上是关于Entity Framework Core Eager Loading 然后包含在集合中的主要内容,如果未能解决你的问题,请参考以下文章
EF6 System.Data.Entity.Core.EntityKey 在 Entity Framework Core 中的等价物是啥?
张高兴的 Entity Framework Core 即学即用:创建第一个 EF Core 应用