AutoMapper .ForMember 用于收集

AutoMapper .ForMember for collection

我有实体 Request 和模型 RequestModel

public class RequestModel : BaseModel
{
    public IEnumerable <int> Recipients { get; set; }
}

public class Request : IIdent
{
    public virtual ICollection <RequestComment> Comments { get; set; }
}

public class RequestComment : IIdent
{
   [ForeignKey("User")]
   public int? UserId { get; set; }
}

我想为 Recipients

创建映射
CreateMap<Request, RequestModel>()
      .ForMember(d => d.Recipients, o => o.MapFrom(s => s.Comments.Select(x => x.UserId )))

但我遇到异常:

AutoMapper.AutoMapperMappingException was caught _HResult=-2146233088 HResult=-2146233088 IsTransient=false Message= Mapping types: Request -> IEnumerable1 AttManager.Data.Request -> System.Collections.Generic.IEnumerable1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] Destination path: RequestModel.Recipients.Recipients Source value: AttManager.Data.Request

当您尝试将 IEnumerable<RequestComment> 转换为 IEnumerable<int> 时出现问题,因此 Automapper 将尝试在 [=15] 之间找到转换=] 到 int,但未定义。

您可以像这样定义从 RequestCommentint 的转换:

.CreateMap<RequestComment, int>().ConvertUsing(rm => rm.UserId ?? 0);

以及请求模型之间的映射:

.CreateMap<Request, RequestModel>()
.ForMember(d => d.Recipients, o => o.MapFrom(s => s.Comments))

此外,另一种解决问题的方法是定义一个 AfterMap 操作:

.CreateMap<Request, RequestModel>()
.AfterMap((r, rm) => rm.Recipients = new List<int>(r.Comments.Select(c => c.UserId ?? 0)));

因为UserId的类型是int?,所以我只加了?? 0,所以Recipients 属性需要转换成int