You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:57:10