使用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
相关产品推荐
相关产品推荐

