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

.NET 6禁用Nullable后对象无法为Null的技术问题咨询

问题分析与解决方案

核心原因推测

你遇到的问题大概率和.NET 6配套的EF Core 6行为变更有关,而非Nullable设置本身:

  • EF Core 6默认启用了延迟加载代理,当访问导航属性(比如Lockbox.SegregationGroup)时,EF会自动创建一个空的代理实例(而非保留null),用于后续延迟加载真实数据。这个代理实例看起来是非空的,但内部属性通常为默认值。
  • 另外,EF Core的关系自动修复机制也可能在追踪实体时,自动初始化导航属性,导致原本应为null的属性被实例化。

具体解决步骤

1. 关闭EF Core延迟加载代理

在你的DbContext配置中显式禁用延迟加载:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseLazyLoadingProxies(false); // 关闭延迟加载代理
    // 其他配置...
}

2. 检查查询是否意外加载了导航属性

确认查询remittanceList的代码中,没有通过Include或ThenInclude主动加载SegregationGroup,避免EF提前实例化该属性:

// 错误示例(会加载SegregationGroup):
var remittanceList = dbContext.Remittances.Include(r => r.RemittanceFile.Lockbox.SegregationGroup).ToList();

// 正确示例(不加载导航属性):
var remittanceList = dbContext.Remittances.ToList();

3. 显式初始化导航属性为null

在Lockbox类的构造函数中强制设置SegregationGroup为null,覆盖EF可能的自动初始化:

public class Lockbox : IEntity
{
    public Lockbox()
    {
        SegregationGroup = null;
    }
    public SegregationGroup SegregationGroup { get; set; }
}

4. 检查序列化/反序列化配置

如果remittanceList是通过序列化(比如System.Text.Json)得到的,检查序列化器是否有自动创建空对象的配置:

// 确保没有开启强制创建对象的配置
var options = new JsonSerializerOptions
{
    DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
};

额外验证

  • 确认所有关联项目的Nullable设置均为disable,避免跨项目的Nullable注解影响。
  • 调试时查看SegregationGroup的类型,如果是Castle.Proxies.SegregationGroupProxy这类代理类型,即可确认是EF延迟加载导致的问题。

内容的提问来源于stack exchange,提问作者NacSquared

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:45:16