发布者发布由作者撰写的图书的方案的数据库关系,这些图书专门签名给发布者,但可能有多个笔名:
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似乎没有表明有一种方法可以加载一个集合,所有单个详细信息实体挂在每个集合条目中,只需一次点击..