使用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
相关产品推荐
相关产品推荐

