2012-05-06 3 views
1

У меня возник вопрос о том, чтобы автомодулировать объекты рамки сущности, которые были «глубоко загружены». У меня есть объект Project, у которого есть член под названием «Задачи», который представляет собой коллекцию. И каждая задача имеет член под названием Works, который является коллекцией. Когда проект загружен глубоко, все участники Tasks и их Works заполнены. Это выглядит следующим образом:Automapper и глубокая загрузка

-- 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?

Благодаря

+0

Все тихо. Нет собеседников? – onefootswill

ответ

2

Вы должны иметь соответствующий объект DATAACCESS для каждого объекта Entity. У вас уже есть сопоставление задач, теперь вам нужно одно для работы. Кроме того, не используйте отдельные ValueResolvers. Вы можете делать все, что вам нужно, используя перегрузки лямбда в ForMember.

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 
; 

Так как вы создали карту для вашего уровня 2'nd глубины в иерархии объектов, вы можете просто вызвать Mapper.Map в перегрузке ResolveUsing лямбды.

+0

Спасибо Dan. Я дам вам знать, как оно идет. – onefootswill

+0

Aweseom Dan. Работал как шарм! Спасибо, кучи. – onefootswill

Смежные вопросы