2016-11-24 99 views
0

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

+0

'.include(..)'不能在核心中工作吗?即。 'db.Blogs.Include(m => m.Posts).Include(m => m.Author).Find(1);' –

+0

是的,但我试图解决明确指定我想要的实体。 https://docs.microsoft.com/en-us/ef/core/querying/related-data – wonea

+0

啊,对不起,所以你的问题是如何加载所有的模型导航道具。我误解了标题,并试图简化它。我可以想出一个简单的方法来做到这一点,反射,但不知道即使是旧的EF也有内置的方法。编辑:即使你链接到的问题将为核心工作,因为你仍然指定要加载的内容。编辑2:我可能是错的,但我认为'.include(..)'比单独加载更快,因为它们将形成初始查询运行的一部分。 –

回答

1

正如在评论中提到,我相当有信心,(虽然我的EF核心的使用是有限的),这个不能自动通过导航性能的标准映射来完成。与使用.Include一样,使用.Load效率更低(时间更长),因为您将像运行延迟加载导航属性本身一样运行多个查询。

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

1;扩展方法加载所有相关实体,像这样:

​​

(请注意,我写这为EagerWhere因此您可以查询更多的控制权,以便它更可重复使用的,而不是一个简单的Find更换)

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

我不会写一个例子,因为我不确定这是值得的努力,由于(通常)创建的实体数量有限。

+0

Afaik dotnet核心不支持反射属性信息。 – alanh

+0

@alanh嗯,我以为是的。它确实缺少了一些东西,但没有像这样重要。但我不能肯定地说,自从RC2以来,我还没有机会再次与Core交手。 –