我是否获得了此EF Core 2.0"加载相关数据"方法正确吗?

时间:2017-11-23 11:10:27

标签: c# entity-framework-core ef-core-2.0

发布者发布由作者撰写的图书的方案的数据库关系,这些图书专门签名给发布者,但可能有多个笔名:

A Publisher has many Books
A Publisher has many SignedAuthors
A SignedAuthor has one AuthorDetails (one AuthorDetails:many SignedAuthors)

SignedAuthor记录用于书写的笔名(因此一本书有SignedAuthor,而不是AuthorDetails)而AuthorDetails是作者的真实细节

我最初没有意识到EF Core没有延迟加载。我第一次这样做了:

for(var pub in _dbContext.Publishers.Where(p => p.Name = "Penguin"))
  //code

然后发现他们似乎从未有过任何书籍。

然后我会尝试显式加载":

_dbContext.Entry(pub).Collection(p => p.Books).Load();

哪个工作正常,但我很难理解如何一次性加载作者的东西。我好像可以这样做:

_dbContext.Entry(pub).Collection(p => p.SignedAuthors).Load();

但我不确定如何让AuthorDetails随之而来。如果我试图单独加载每一个,肯定会用查询攻击数据库,通过PK一次选择一行:

//do for every signedauthor already loaded
_dbContext.Entry(signedauthor).Reference(sa => sa.AuthorDetail).Load();

所以我废弃了所有的东西,而是将其写入" eager load"我想用的一切:

         var pubs = 
            _dbContext.Publishers
              .Where(p => p.Name = "Penguin")
                .Include(e => e.Books)
                .Include(e => e.SignedAuthors)
                  .ThenInclude(e => e.AuthorDetails);

工作正常;我不知道它需要多少SQL,尽管我想它只是一个(pub JOIN book JOIN signedauthors JOIN authordetails)

问题1)这是正确的形式,以及#34; eager load"我想要使​​用的所有数据?它只组装一个带有多个连接的SQL查询吗?

问题2)我应该如何执行"显式加载"直接地,以高效的方式,特别是SignedAuthors和Authors之间的联接?

https://docs.microsoft.com/en-us/ef/core/querying/related-data似乎没有表明有一种方法可以加载一个集合,所有单个详细信息实体挂在每个集合条目中,只需一次点击..

0 个答案:

没有答案