如何使用Entity Framework从Cosmos Db查询带Book子文档的Author实体数据
问题原因
EF Core 操作 Cosmos DB 时默认不会自动加载导航属性,你当前直接查询 Authors 数据集只会拉取所有 Author 类型的独立文档,不会自动关联查询对应的 Book 文档,所以 Books 集合为空。
解决方案
你可以根据自己的业务场景选择以下任意一种方式解决:
方案1:使用
Include预加载关联属性(推荐,适合 Author 和 Book 都需要作为独立文档查询的场景)
只需要在查询 Authors 时加上 Include 指定要加载的关联导航属性即可,调整后的查询代码如下:using (var context = new BookStoreDbContext()) { // 加Include预加载Books集合 var list = context.Authors.Include(a => a.Books).ToList(); foreach (var author in list) { Console.WriteLine(author.FirstName + " " + author.LastName); foreach (var book in author.Books) { Console.WriteLine("\t" + book.Title); } } }注意:该特性需要 EF Core 3.0 及以上版本支持,同时确保你的 Book 实体正确配置了指向 Author 的外键关联。
方案2:配置 Book 为 Author 的从属实体,嵌套存储(适合不需要单独查询 Book 的场景)
如果你不需要把 Book 作为独立文档查询,可以在 DbContext 的OnModelCreating方法中配置 Book 是 Author 的从属集合,这样数据写入时会直接把 Books 作为嵌套数组存到同一个 Author 文档里,查询时不需要加 Include 也能自动获取到 Books 数据,配置代码如下:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Author>() .OwnsMany(a => a.Books); }
内容的提问来源于stack exchange,提问作者coolblue2000
相关产品推荐
相关产品推荐

