为何C#认为EF的Include()方法返回可空对象?
问题原因及解释
首先,你查阅的是Entity Framework 5(EF5)的Include方法文档,但代码中使用的ThenInclude是EF5没有的特性——这说明你实际使用的是EF Core或EF6及以上版本,而这些版本在启用**可为空引用类型(Nullable Reference Types)**的项目中,Include的返回类型会结合实体类导航属性的可空性做推断,和旧版文档的声明存在差异。
警告的核心原因
- 你的
County实体类中,Events导航属性应该被声明为ICollection<Event>?(可空集合类型),因此调用Include(c => c.Events)后,返回的查询类型是IIncludableQueryable<County, ICollection<Event>?>,明确标记了被包含的属性可能为null。 - 而后续调用的
ThenInclude重载,要求输入的源类型是IIncludableQueryable<County, IEnumerable<Event>>(非可空集合类型),两者的可空性不匹配,因此触发CS8620警告。 - 你看到的EF5文档里
Include返回IQueryable<T>不带可空标记,是因为EF5不支持可为空引用类型(该特性是C# 8.0+和EF Core 3.0+引入的),旧文档自然不会体现这种可空性差异。
解决方式
除了添加!非空断言(告诉编译器你确认该值不会为null)外,还可以:
- 调整实体类的
Events属性为非可空类型(ICollection<Event>),并在实体构造函数中初始化空集合(比如public County() { Events = new List<Event>(); }),从根源上消除可空性不匹配。 - 若业务上允许
Events为null,也可以使用适配可空类型的ThenInclude重载(不过通常更推荐规范实体类的可空性声明)。
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

