【问题标题】:Explicitly load all navigation properties显式加载所有导航属性
【发布时间】:2021-09-07 00:59:10
【问题描述】:

EF Core 最近添加了显式加载对象的导航属性;

using (var db = new BloggingContext()) {
    var blog = db.Blogs.Find(1);

    db.Entry(blog).Collection(b => b.Posts).Load();
    db.Entry(blog).Reference(b => b.Author).Load();
}

https://blogs.msdn.microsoft.com/dotnet/2016/11/16/announcing-entity-framework-core-1-1/

这显然很冗长,我不希望每次都进行这些检查。是否有任何扩展方法或补充 NuGet 包可以解决这些缺点?

我知道这是一个常见问题,但不是 EF Core。

EntityFramework Eager Load all Navigation Properties

【问题讨论】:

  • .Include(..) 不能在核心中工作吗? IE。 db.Blogs.Include(m => m.Posts).Include(m => m.Author).Find(1);
  • 是的,但我试图绕过明确指定我想要的实体。 docs.microsoft.com/en-us/ef/core/querying/related-data
  • 啊,抱歉,所以你的问题是如何从该模型加载所有导航道具。我误读了标题,并试图让它更简单。我可以想出一种简单的方法来使用反射,但不确定即使对于旧 EF 也有内置方法。编辑:即使您链接到的问题也适用于 Core,因为您仍在指定要加载的内容。 EDIT2:我可能是错的,但我认为.Include(..) 也比单独加载更快,因为它们将构成初始查询运行的一部分。
  • 以这种方式加载它们与仅使用延迟加载大致相同(将为每个导航属性进行单独的查询)。那你为什么要这么做?
  • @IvanStoev 我想我最好不要再评论\回答 EF Core 问题,因为即使是基本假设也失败了 :)

标签: c# entity-framework-core


【解决方案1】:

正如 cmets 中所述,我相当有信心(尽管我对 EF Core 的使用有限)这不能通过导航属性的标准映射自动完成。此外,使用 .Load 的效率低于使用 .Include 的效率(而且要长得多),因为您将运行多个查询,就像使用延迟加载导航属性本身一样。

我可以想到两种方法来解决不希望每次都根据您的问题进行检查的问题。第一个适用于专门加载您的 Blog 实体,第二个您可以在其他实体中重复使用,但仍需要更改您的加载。

1;加载所有相关实体的扩展方法,如下所示:

public static IQueryable<Blog> EagerWhere(this DbSet<Blogs> dbset, Expression<Func<Blog, bool>> expr) {
    return dbset
        .Include(m => m.Posts)
        .Include(m => m.Author)
        .Where(expr);
}

// .. usage

db.Blogs.EagerWhere(m => m.Id == 1);

(请注意,我将其写为 EagerWhere,因此您可以更好地控制查询,因此它更可重用,而不是简单的 Find 替换)

2;编写一个自定义属性,并编写一个与上述类似的方法,该方法执行与.Find(..) 相同的操作,但使用反射来查找具有您自定义属性的属性,并将它们递归地传递给.Include(..)

我不会为此编写示例,因为(通常)创建的实体数量有限,我不确定这样做是否值得。

【讨论】:

  • Afaik dotnet core 还不支持反射属性信息。
  • @alanh 嗯,我想是的。它肯定缺少一些东西,但没有比这更重要的了。不过我不能肯定地说,自从 RC2 以来,我再也没有机会接触 Core。
【解决方案2】:

现在,在 ef core5.0 中,你可以使用这段代码

//in OnModelCreating
modelBuilder.Entity<XXX>().Navigation(t => t.XX).AutoInclude();

【讨论】:

  • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
  • 这在 EF Core 5 中不可用。它在 EF Core 6 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 2021-03-20
  • 2016-11-21
  • 2021-11-26
  • 2016-12-21
  • 1970-01-01
相关资源
最近更新 更多