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

使用AutoMapper单元测试时遇“Coalesce用于非可空类型”错误

解决AutoMapper合并操作错误:Coalesce used with type that cannot be null

问题根源

这个错误是因为AutoMapper生成映射代码时,对不可空值类型(如值类型record、Guid等)误用了空合并运算符(??)——不可空类型本身不允许为null,导致语法冲突。你怀疑的List<类>与List<值类型record>转换问题确实是高发场景,AutoMapper默认的集合映射逻辑会错误引入空合并操作。

具体修复方案

1. 显式配置集合映射规则

针对涉及值类型record的集合,手动指定映射逻辑,避免AutoMapper自动生成错误代码:

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        // 基础实体与值类型record的双向映射
        CreateMap<YourEntity, YourValueRecord>().ReverseMap();
        
        // 显式处理集合映射,绕过AutoMapper默认的空合并逻辑
        CreateMap<List<YourEntity>, List<YourValueRecord>>()
            .ConvertUsing(src => src.Select(Mapper.Map<YourValueRecord>).ToList());
        
        CreateMap<List<YourValueRecord>, List<YourEntity>>()
            .ConvertUsing(src => src.Select(Mapper.Map<YourEntity>).ToList());
    }
}

2. 全局禁用空合并优化

在AutoMapper配置中关闭自动生成空合并运算符的逻辑,适合全局存在不可空值类型映射的场景:

var configuration = new MapperConfiguration(cfg =>
{
    cfg.DisableNullCoalescing(); // 禁用空合并优化
    cfg.AddProfile<MappingProfile>();
});

3. 处理不可空属性的映射

如果值类型record的属性为不可空,确保源实体对应属性不会为null,或显式设置默认值:

CreateMap<YourEntity, YourValueRecord>()
    .ForMember(dest => dest.NonNullableProp, opt => opt.MapFrom(src => src.NullableProp ?? defaultValue));

4. 升级AutoMapper版本

AutoMapper 12.0.1存在不可空类型映射的已知bug,升级到12.x后续稳定版,官方可能已修复此类问题。

验证测试

修改配置后重新运行单元测试,确认映射逻辑正常执行,错误不再出现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:52:06