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

使用C# Automapper映射模型出错:Guid与int类型映射冲突

问题原因

Automapper默认会基于属性名称匹配自动映射同名属性,你的TopicModel有Guid Id,而Topic继承自BaseEntity有int Id,两者同名,所以即使你配置了Uid的映射规则,Automapper仍然会尝试把Guid Id映射到int Id,导致类型不匹配错误。

解决方案

1. 忽略默认的Id映射规则

在TopicModel到Topic的映射配置中,明确忽略目标的Id属性,阻止Automapper的默认同名映射:

public class TopicModelProfile : Profile
{
    public TopicModelProfile()
    {
        CreateMap<TopicModel, Topic>()
            .ForMember(dest => dest.Uid, opt => opt.MapFrom(src => src.Id))
            .ForMember(dest => dest.Id, opt => opt.Ignore()); // 关键:忽略int类型的Id属性映射

        CreateMap<Topic, TopicModel>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Uid));
    }
}

2. 确保Profile被正确注册

检查项目的启动配置(比如Program.cs或Startup.cs),确认已经将TopicModelProfile添加到Automapper的服务中:

// .NET 6+ Program.cs
builder.Services.AddAutoMapper(typeof(TopicModelProfile));

3. 明确映射的源/目标类型(可选)

在PostTopicsResolver中,明确指定源和目标的集合类型,避免Automapper推断错误:

private class PostTopicsResolver : IValueResolver<CreatePostModel, Post, ICollection<Topic>>
{
    public ICollection<Topic> Resolve(CreatePostModel source, Post destination, ICollection<Topic> member, ResolutionContext context)
    {
        // 明确指定源类型ICollection<TopicModel>和目标类型ICollection<Topic>
        return context.Mapper.Map<ICollection<TopicModel>, ICollection<Topic>>(source.Topics);
    }
}
验证逻辑

修改后,Automapper会完全遵循你配置的规则:

  • 把TopicModel.Id映射到Topic.Uid
  • 不再尝试映射同名的Topic.Id(因为被忽略)
  • 反向映射时Topic.Uid映射到TopicModel.Id,不受影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:45:14