想知道是否有人可以帮助我解决我似乎遇到的EF问题。
我查看了MS网站上的相关数据文档 - https://docs.microsoft.com/en-us/ef/core/querying/related-data
以他们的例子为基础,我得到了一个Blog
对象。博客有与其关联的Post
个对象。帖子对象与Authors
相关联。
我希望能够使用Blog
对象检索Post
对象,以便我能够:
var blogs = context.Blogs
.Include(blog => blog.Posts)
.ToList();
我遇到的问题是,这样做意味着Post
对象也具有从查询返回的Author
对象。查看文档看起来我需要使用以下内容来填充Author
对象:
var blogs = context.Blogs
.Include(blog => blog.Posts)
.ThenInclude(post => post.Author)
.ToList();
我是否遗漏了一些可以让我通过帖子获取博客对象的内容 - 而不是作者?
答案 0 :(得分:1)
我认为你忽略了这个提示:
实体框架核心将自动修复导航属性 先前加载到上下文中的任何其他实体 实例即可。所以,即使你没有明确地包含a的数据 导航属性,属性可能仍然填充,如果一些或 所有相关实体之前已加载。
我认为这是混乱的来源。
您的查询未加载Author
。但如果它之前被加载,则有可能填充它(因为如果使用依赖注入,则在整个请求中共享上下文)。
.ThenInclude(post => post.Author)
显式加载Author
。
您可以通过创建自己的范围轻松验证这一点:
public class MyService
{
private readonly IServiceScopeFactory _scopeFactory;
public MyService(IServiceScopeFactory scopeFactory)
{
_scopeFactory = scopeFactory;
}
public IEnumerable<Blogs> GetBlogs()
{
using (var scope = _scopeFactory.CreateScope())
using (var context = scope.ServiceProvider.GetService<MyDbContext>())
{
return context.Blogs
.Include(blog => blog.Posts)
.ToList();
}
}
}