+-
c#-AutoMapper .ForMember进行收集
我有实体Request和Model 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; }
}

我想为收件人创建映射

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.IEnumerable
1[[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&gt ;,因此Automapper将尝试查找RequestComment到int之间的转换,但未定义. 您可以像这样定义从RequestComment到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.

点击查看更多相关文章

转载注明原文:c#-AutoMapper .ForMember进行收集 - 乐贴网