AutoMapper .ForMember for collection

时间:2016-05-10 16:48:39

标签: 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; }
}

我想为Recipients

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

但我得到例外:

  

AutoMapper.AutoMapperMappingException被捕获_HResult = -2146233088 HResult = -2146233088 IsTransient = false Message = Mapping类型:   请求 - &gt; IEnumerable 1 AttManager.Data.Request -> System.Collections.Generic.IEnumerable 1 [[System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]   目的地路径:   RequestModel.Recipients.Recipients   来源价值:   AttManager.Data.Request

1 个答案:

答案 0 :(得分:3)

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

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

int

请求模型之间的映射:

.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))); ,因为?? 0类型为UserId,因此需要将int?转换为int属性。