AutoMapper .ForMember 用于收集

dem*_*emo 7 c# mapping automapper

我有实体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; }
}
Run Code Online (Sandbox Code Playgroud)

我想创建映射 Recipients

CreateMap<Request, RequestModel>()
      .ForMember(d => d.Recipients, o => o.MapFrom(s => s.Comments.Select(x => x.UserId )))
Run Code Online (Sandbox Code Playgroud)

但我得到了例外:

AutoMapper.AutoMapperMappingException 被捕获 _HResult=-2146233088 HResult=-2146233088 IsTransient=false 消息= 映射类型:请求 -> IEnumerable 1 AttManager.Data.Request -> System.Collections.Generic.IEnumerable1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKey95cbination]D路径:RequestModel.Recipients.Recipients 源值:AttManager.Data.Request

Art*_*aca 5

当你试图将一个转换的问题来自IEnumerable<RequestComment>IEnumerable<int>,所以Automapper是要设法找到之间的转换RequestCommentint的,但没有定义。

您可以像这样定义从RequestComment到的转换int

.CreateMap<RequestComment, int>().ConvertUsing(rm => rm.UserId ?? 0);
Run Code Online (Sandbox Code Playgroud)

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

.CreateMap<Request, RequestModel>()
.ForMember(d => d.Recipients, o => o.MapFrom(s => s.Comments))
Run Code Online (Sandbox Code Playgroud)

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

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

我只是添加,?? 0因为UserIdtype is int?,所以需要转换为intforRecipients属性。