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。
答案 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(..)
。
我不会为此写一个例子,因为我不确定由于(通常)创建的实体数量有限而值得努力。