自动映射器和深度加载
我有一个关于自动映射实体框架对象的问题,这些对象已被“深度加载”。 我有一个Project对象,它有一个叫做Tasks的成员,它是一个集合。 并且每个任务都有一个名为Works的成员,它是一个集合。 当项目深度加载时,这些任务及其工作成员都将被填充。 它看起来像这样:
-- Project
-- Task 1
-- Work 1
-- Work 2
-- Task 2
-- Work 3
我已经想出了如何使用像这样的解析器来映射1级深层:
CreateMap<DataAccess.Task, Entities.Task>()
.ForMember(obj => obj.Description, obj => obj.MapFrom(src => src.Description))
.ForMember(obj => obj.Estimate, obj => obj.MapFrom(src => src.Estimate))
.ForMember(obj => obj.Id, obj => obj.MapFrom(src => src.ID))
.ForMember(obj => obj.ProjectId, obj => obj.MapFrom(src => src.Project))
.ForMember(obj => obj.TaskName, obj => obj.MapFrom(src => src.TaskName))
.ForMember(obj => obj.Visible, obj => obj.MapFrom(src => src.Visible))
.ForMember(obj => obj.WorkItems, obj => obj.ResolveUsing<WorkItemsResolver>().FromMember(src => src.Works));
public class WorkItemsResolver : ValueResolver<EntityCollection<DataAccess.Work>, ICollection<Entities.Work>>
{
#region Overrides of ValueResolver<List<Task>,List<Task>>
protected override ICollection<Entities.Work> ResolveCore(EntityCollection<DataAccess.Work> source)
{
Mapper.EntitiesMapper entitiesMapper = new EntitiesMapper();
return source.Select(wk => entitiesMapper.Map<Entities.Work>(wk)).ToList();
}
#endregion
}
然而,我无法弄清楚如何深入2层,也就是说能够映射顶层对象(Project),并让它的子列表(及其子列表)也映射到它们的伴随业务对象。
有谁知道这是否可以使用Automapper?
谢谢
您应该为每个实体对象都有相应的DataAccess对象。 你已经有一个任务映射,现在你需要一个工作。 另外,请勿使用单独的ValueResolver。 您可以使用ForMember中的lambda重载完成您所需的任何操作。
CreateMap<DataAccess.Task, Entities.Task>()
// when names match on both sides, there is no need to call ForMember
//.ForMember(obj => obj.Description, obj => obj.MapFrom(src => src.Description))
//.ForMember(obj => obj.Estimate, obj => obj.MapFrom(src => src.Estimate))
//.ForMember(obj => obj.Id, obj => obj.MapFrom(src => src.ID))
.ForMember(obj => obj.ProjectId, obj => obj.MapFrom(src => src.Project))
//.ForMember(obj => obj.TaskName, obj => obj.MapFrom(src => src.TaskName))
//.ForMember(obj => obj.Visible, obj => obj.MapFrom(src => src.Visible))
.ForMember(obj => obj.WorkItems, obj => obj.ResolveUsing(src =>
Mapper.Map<IEnumerable<DataAccess.Work>>(src.Works)))
;
CreateMap<DataAccess.Work, Entities.Work>()
// only call ForMember on properties that don't map automatically
;
由于您在对象层次结构中为您的第二层深度创建了映射,因此可以在ResolveUsing lambda超载中调用Mapper.Map。
链接地址: http://www.djcxy.com/p/37401.html