2016-10-15 49 views
2

我一直在這一段時間停留,我很難過。 Automapper需要4秒鐘來映射19個對象。操作應該在我的機器上花費毫秒或納秒(24gb ram,3.6Ghz i7)。AutoMapper需要4秒來映射19個對象

這是映射調用。

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.MapFrom(SRC => src.ConversationUsers)); –

回答

3

總之,正在進行數據庫調用。

AutoMapper呼喚你的關係屬性獲取,其使用的EntityFramework加載從數據庫中的數據。

快速修復是禁用延遲加載的集合。

2

Message類是你的實體框架模型的一部分,而你似乎有延遲加載功能。因此,當從Message類映射時,屬性MediaMessagesReadReceipts不會從數據庫中加載,AutoMapper會觸發它們被延遲加載。因此,這4秒實際上是在映射期間發生的2次數據庫調用。

你應該急切地映射之前加載實體。在查詢過程中禁用延遲加載並手動.Include()可能是一個更好的主意。