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.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>
时出现问题,因此 Automapper 将尝试在 [=15] 之间找到转换=] 到 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)));
因为UserId
的类型是int?
,所以我只加了?? 0
,所以Recipients
属性需要转换成int
。
我有实体 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 -> IEnumerable
1 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>
时出现问题,因此 Automapper 将尝试在 [=15] 之间找到转换=] 到 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)));
因为UserId
的类型是int?
,所以我只加了?? 0
,所以Recipients
属性需要转换成int
。