EF Core预加载关联集合报CS1061错误如何修复
问题根因
出现CS1061编译错误的核心原因有两个:
- C#类成员默认访问级别为
private,你定义的Book.Chapters、Chapter.Pages等导航属性都没有显式加访问修饰符,仅能在实体类内部访问,API层的查询代码无权读取这些属性。 - 实体类命名空间不统一,
Book放在Core.Entities.BookAggregate下,Chapter放在Core.Entities下,后续运行还会触发类型找不到的连锁错误。
修复步骤
按以下位置修改即可解决问题:
- 修改
Core/Entities/BookAggregate/Book.cs
给所有需要被外部访问的属性加上public修饰符,同时补充Chapter类的命名空间引用:// 补充命名空间引用 using Core.Entities; namespace Core.Entities.BookAggregate { public class Book : BaseEntity, IAggregateRoot { // 给属性加public修饰符 public String Title { get; set; } public List<Chapter> Chapters { get; set; } private Book() { Chapters = new List<Chapter>(); } public Book(string title) { Title = title; Chapters = new List<Chapter>(); } // 其余业务方法保持不变 } } - 修改
Core/Entities/Chapter.cs
同样给属性加public修饰符,后续Page、Cell实体也要做相同处理:
同步检查namespace Core.Entities { public class Chapter : BaseEntity { // 给属性加public修饰符 public String Title { get; set; } public List<Page> Pages { get; set; } // 其余构造函数、业务方法保持不变 } }Page类的Cells导航属性,必须设置为public,否则后续.ThenInclude(page => page.Cells)会报完全相同的编译错误。 - (推荐)统一实体命名空间
将属于Book聚合的Chapter、Page、Cell实体都移动到Core.Entities.BookAggregate命名空间下,既符合DDD聚合的设计规范,也能避免跨层引用实体时出现的命名空间缺失问题。
补充说明
如果你需要严格实现领域模型封装,不想对外暴露public的集合导航属性,可以将导航属性保留为private,在DbContext的
OnModelCreating方法中通过EF Core元数据API配置导航属性关联,不需要在查询层直接访问属性。但你当前使用的是Lambda直接访问导航属性的预加载写法,必须保证Lambda中访问的属性对当前执行代码可见。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

