当CompanyId为Null时,AutoMapper为何自动生成空Company实体?
问题
数据库上下文包含User和Company模型,管理员角色用户不关联公司,其他角色用户需关联公司:
public class User { public UserRole Role { get; set; } public int? CompanyId { get; set; } public virtual Company? Company { get; set; } } public class Company { public virtual ObservableCollection<User> Users { get; set; } = []; }
对应的DTO定义如下:
public class UserDto { public int? CompanyId { get; set; } public string CompanyName { get; set; } = ""; } public record CompanyOverviewDto(int Id, bool Active, string Name); public class CompanyDto { public List<UserDto> Users { get; set; } = []; }
AutoMapper配置:
public class AutoMapperProfile : Profile { public AutoMapperProfile() { CreateMap<Company, CompanyOverviewDto>(); CreateMap<Company, CompanyDto>().ReverseMap(); CreateMap<User, UserDto>() .ReverseMap(); } }
当前问题:当传入的UserDto的CompanyId为Null时,映射生成的User对象中CompanyId为Null,但Company属性却被初始化为非空的空实体,期望CompanyId为Null时Company属性也为Null。
解决方案
修改AutoMapper中UserDto到User的反向映射配置,显式指定当CompanyId为Null时,将Company属性设为Null,避免AutoMapper自动创建空实例:
public class AutoMapperProfile : Profile { public AutoMapperProfile() { CreateMap<Company, CompanyOverviewDto>(); CreateMap<Company, CompanyDto>().ReverseMap(); CreateMap<User, UserDto>() .ReverseMap() .ForMember(dest => dest.Company, opt => { // 仅当CompanyId有值时才尝试映射Company属性 opt.Condition(src => src.CompanyId.HasValue); // 当不满足条件时,将Company设为Null opt.NullSubstitute(null); }); } }
补充说明
AutoMapper默认会为引用类型属性创建空实例(即使源数据中没有对应值),通过添加Condition可以限制只有当CompanyId存在有效值时才处理Company属性的映射,再配合NullSubstitute确保不满足条件时Company直接设为Null,完全符合业务需求。
内容的提问来源于stack exchange,提问作者Avrohom Yisroel
相关产品推荐
相关产品推荐

