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
当你试图将一个转换的问题来自IEnumerable<RequestComment>于IEnumerable<int>,所以Automapper是要设法找到之间的转换RequestComment来int的,但没有定义。
您可以像这样定义从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属性。