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

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); 
}

关键说明

  1. Adapt(source, target, config)重载:这个方法会将源对象(DTO)的属性值映射到目标对象(已有实体)上,目标对象中未被DTO覆盖的属性会保留原有值,不会被置为null。
  2. IgnoreNullValues(true):作用是当DTO中的属性值为null时,不覆盖目标对象对应属性的现有值,避免把数据库里的非null值冲成null。
  3. IgnoreMember配置:明确指定哪些属性完全不参与映射,确保这些属性始终保留数据库中的原始值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:35:08