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

.NET 7中Mapster嵌套集合映射失败问题求助

Mapster二级嵌套集合映射失败的原因与解决方法

问题原因

  1. 循环引用触发递归映射中断:你在TestB → B的配置中手动映射dest.A = src.TestA.Adapt<A>(),这会触发TestA → A的映射,而TestA → A又会处理Bs集合,进而再次触发TestB → B的映射,形成无限递归。Mapster为防止栈溢出,会自动跳过循环引用中的部分映射逻辑,导致Cs集合未被正确处理。
  2. 手动调用Adapt丢失映射上下文:在TestA → A的配置中,你手动使用src.TestBs.Adapt<List<B>>()映射集合,这种方式没有复用已注册的TestB → B映射配置上下文,导致嵌套的Cs集合映射逻辑未被执行。

解决方案

修改映射配置,移除循环引用的手动映射,让Mapster自动处理嵌套集合和循环引用:

简化版映射配置

public class TestMapping : IRegister
{
    public void Register(TypeAdapterConfig config)
    {
        // 启用循环引用处理,避免无限递归
        config.Default.IgnoreCycles();

        // 所有属性名称和类型匹配,Mapster会自动完成映射,无需手动配置每个属性
    }
}

自定义属性映射版(若需保留部分手动配置)

public class TestMapping : IRegister
{
    public void Register(TypeAdapterConfig config)
    {
        config.Default.IgnoreCycles();

        config.NewConfig<TestA, A>()
              .Map(dest => dest.Id, src => src.Id);

        config.NewConfig<TestB, B>()
              .Map(dest => dest.Id, src => src.Id)
              .Ignore(dest => dest.A); // 可选:若不需要B中的A对象,直接忽略避免循环引用

        config.NewConfig<TestC, C>()
              .Map(dest => dest.Id, src => src.Id);
    }
}

修改后测试结果

运行原测试代码,输出的JSON会正确包含Cs集合:

{
    "id": 1,
    "bs": [
        {
            "id": 1,
            "a": null,
            "cs": [
                {
                    "id": 1
                }
            ]
        },
        {
            "id": 2,
            "a": null,
            "cs": [
                {
                    "id": 2
                }
            ]
        }
    ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:57:35