显式加载所有导航属性

时间:2016-11-24 10:52:23

标签: c# entity-framework-core

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

1 个答案:

答案 0 :(得分:2)

正如评论中所提到的,我相当自信(尽管我对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(..)相同的操作,但使用Reflection查找具有自定义属性的属性,并以递归方式将它们传递给.Include(..)

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