2016-10-15 3 views
2

私はしばらくこのことに執着していましたが、私は困惑しています。 Automapperは19オブジェクトをマップするのに4秒かかる。私のマシンでは、動作にはミリ秒かナノ秒かかります(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()を使用する方が良いでしょう。

関連する問題