2016-10-15 1 views
2

나는 잠시 동안 여기에 갇혀 있었고, 나는 혼란 스럽다. 오토 매퍼는 19 개의 개체를 매핑하는 데 4 초가 걸렸습니다. 작업은 내 컴퓨터에서 24 밀리 초 또는 나노 초가 걸립니다 (24GB RAM, 3.6Ghz i7).AutoMapper가 19 초 객체를 매핑하는 데 4 초 걸리는 것

이것은 매핑 호출입니다.

var messageDtos = AutoMapperConfig.Mapper.Map<List<Message>, List<MessageDTO>>(messages); 

이 여기에 해당 객체가 내 Automapper의 설정

public static class AutoMapperConfig 
{ 
    public static IMapper Mapper; 
    public static void Configure() 
    { 
     MapperConfiguration config = new MapperConfiguration(cfg => 
     { 
      cfg.CreateMap<User, UserDTO>(); 
      cfg.CreateMap<UserDTO, User>(); 
      cfg.CreateMap<ConversationUser, ConversationUserDTO>(); 
      cfg.CreateMap<ConversationUserDTO, ConversationUser>(); 
      cfg.CreateMap<Conversation, ConversationDTO>(); 
      cfg.CreateMap<ConversationDTO, Conversation>() 
      .ForMember(dest => dest.ConversationUsers, opt => opt.MapFrom(src => src.ConversationUsers)); 

      cfg.CreateMap<Message, MessageDTO>(); 
      cfg.CreateMap<MessageDTO, Message>(); 

     }); 

     Mapper = config.CreateMapper(); 

    } 
} 

입니다. 그들은 미친 것이 아닙니다. 여기

public class Message 
{ 
    public int MessageId { get; set; } 
    public virtual Conversation Conversation { get; set; } 
    public virtual User User { get; set; } 
    public string Text { get; set; } 
    public DateTime CreateDate { get; set; } 
    public virtual ICollection<MediaMessage> MediaMessages { get; set; } 
    public virtual ICollection<ReadReceipt> ReadReceipts { get; set; } 

    public Message() 
    { 
     CreateDate = DateTime.Now; 
    } 
} 

public class MessageDTO 
{ 
    public int MessageId { get; set; } 
    public virtual ConversationDTO Conversation { get; set; } 
    public virtual UserDTO User { get; set; } 
    public string Text { get; set; } 
    public DateTime CreateDate { get; set; } 
    public virtual ICollection<MediaMessage> MediaMessages { get; set; } 
    public virtual ICollection<ReadReceipt> ReadReceipts { get; set; } 
    public string Type { get; set; } 
    public string TransferGuid { get; set; } 
} 

public class ConversationDTO 
{ 
    public int ConversationId { get; set; } 
    public virtual UserDTO Owner { get; set; } 
    public virtual DateTime CreateDate { get; set; } 
    public virtual ICollection<ConversationUserDTO> ConversationUsers { get; set; } 
    public virtual Image Image { get; set; } 
    public virtual Message RecentMessage { get; set; } 
} 

public class UserDTO 
{ 
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public DateTime CreateDate { get; set; } 
    public virtual PhoneNumber PhoneNumber { get; set; } 
    public virtual string TwitterHandel { get; set; } 
    public virtual Image Image { get; set; } 
} 

는 Automapper이 걸리는 시간,이 제공 얼마나 통찰력 확실하지, 난 그냥이를 알아 내기 위해 어제 dotrace을 설치 보여주는 점 추적의 스크린 샷이다. Automapper dotTrace breakdown

+0

이 줄이 문제가 될 것이라고 생각합니다 .ForMember (dest => dest.ConversationUsers, opt => opt.MapFrom (src => src.ConversationUsers)); –

답변

3

즉, 데이터베이스 호출이 수행되고 있습니다.

AutoMapper는 EntityFramework를 사용하여 데이터베이스에서 데이터를로드하는 관계형 속성 getters를 호출합니다.

빠른 수정은 지연로드 된 모음을 비활성화하는 것입니다.

2

Message 클래스는 Entity Framework 모델의 일부이며 지연로드가 활성화 된 것 같습니다. 따라서 해당 Message 클래스에서 매핑하는 동안 MediaMessagesReadReceipts 속성은 데이터베이스에서 아직로드되지 않고 AutoMapper가 지연로드되도록 트리거합니다. 그래서 그 4 초 실제로 매핑 중에 일어나는 2 데이터베이스 호출입니다.

엔티티를 매핑하기 전에 열심히로드해야합니다. 지연로드를 사용하지 않도록 설정하고 쿼리 중에 수동으로 .Include()을 사용하는 것이 좋습니다.