实体框架核心相关数据

时间:2017-10-26 15:52:46

标签: c# entity-framework .net-core

想知道是否有人可以帮助我解决我似乎遇到的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();

我是否遗漏了一些可以让我通过帖子获取博客对象的内容 - 而不是作者?

1 个答案:

答案 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();
        }

    }
}
相关问题