Blazor项目中使用Mapster时忽略空值与指定成员的问题排查
问题根源
你当前的代码逻辑存在核心错误:你调用的relationDto.Adapt<CRM_CustomerRelation>(config)是创建一个全新的CRM_CustomerRelation实例,而非将DTO的值更新到你从数据库查询出来的已有实体对象上。新实例中未被DTO映射的属性(SortID、CreatedBy等)自然会被初始化为默认值(null),和你配置的忽略规则无关。
解决方法
使用Mapster的更新已有对象重载方法,直接将DTO的值映射到从数据库获取的实体上,而非创建新对象。
修正后的代码
var config = new TypeAdapterConfig(); // 合并配置,无需分开调用NewConfig和ForType config.NewConfig<RelationDTO, CRM_CustomerRelation>() .IgnoreNullValues(true) .IgnoreMember(member => member.Name == "SortID" || member.Name == "CreatedBy" || member.Name == "DateCreated" || member.Name == "TimeCreated"); CRM_CustomerRelation relation; if(isNewMode) { // 新建模式下,创建新实体(保留原逻辑即可) relation = relationDto.Adapt<CRM_CustomerRelation>(config); } else { // 从数据库获取已有实体 relation = GetRelationFromDatabase(); // 直接更新已有实体,无需重新赋值 relationDto.Adapt(relation, config); }
关键说明
Adapt(source, target, config)重载:这个方法会将源对象(DTO)的属性值映射到目标对象(已有实体)上,目标对象中未被DTO覆盖的属性会保留原有值,不会被置为null。IgnoreNullValues(true):作用是当DTO中的属性值为null时,不覆盖目标对象对应属性的现有值,避免把数据库里的非null值冲成null。IgnoreMember配置:明确指定哪些属性完全不参与映射,确保这些属性始终保留数据库中的原始值。
内容的提问来源于stack exchange,提问作者hdv212
相关产品推荐
相关产品推荐

