C# AutoMapper需要4秒来映射19个对象

C# AutoMapper需要4秒来映射19个对象,c#,asp.net,automapper,C#,Asp.net,Automapper,我在这件事上已经有一段时间了,我被难住了。Automapper需要4秒钟来映射19个对象。在我的机器(24gb ram,3.6Ghz i7)上,操作应该需要毫秒或纳秒 这是映射调用 var messageDtos = AutoMapperConfig.Mapper.Map<List<Message>, List<MessageDTO>>(messages); var messageDtos=AutoMapperConfig.Mapper.Map(消息);

我在这件事上已经有一段时间了,我被难住了。Automapper需要4秒钟来映射19个对象。在我的机器(24gb ram,3.6Ghz i7)上,操作应该需要毫秒或纳秒

这是映射调用

 var messageDtos = AutoMapperConfig.Mapper.Map<List<Message>, List<MessageDTO>>(messages);
var messageDtos=AutoMapperConfig.Mapper.Map(消息);
这是我的自动映射配置

    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();

    }
}
公共静态类AutoMapperConfig
{
公共静态图像映射器;
公共静态void Configure()
{
MapperConfiguration配置=新的MapperConfiguration(cfg=>
{
CreateMap();
CreateMap();
CreateMap();
CreateMap();
CreateMap();
cfg.CreateMap()
.ForMember(dest=>dest.ConversationUsers,opt=>opt.MapFrom(src=>src.ConversationUsers));
CreateMap();
CreateMap();
});
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; }
}
公共类消息
{
public int MessageId{get;set;}
公共虚拟会话{get;set;}
公共虚拟用户用户{get;set;}
公共字符串文本{get;set;}
公共日期时间CreateDate{get;set;}
公共虚拟ICollection MediaMessages{get;set;}
公共虚拟ICollection ReadReceipts{get;set;}
公共信息()
{
CreateDate=DateTime.Now;
}
}
公共类MessageDTO
{
public int MessageId{get;set;}
公共虚拟会话到会话{get;set;}
公共虚拟用户到用户{get;set;}
公共字符串文本{get;set;}
公共日期时间CreateDate{get;set;}
公共虚拟ICollection MediaMessages{get;set;}
公共虚拟ICollection ReadReceipts{get;set;}
公共字符串类型{get;set;}
公共字符串TransferGuid{get;set;}
}
公共课对话
{
public int ConversationId{get;set;}
公共虚拟用户到所有者{get;set;}
公共虚拟日期时间CreateDate{get;set;}
公共虚拟ICollection会话用户{get;set;}
公共虚拟映像映像{get;set;}
公共虚拟消息RecentMessage{get;set;}
}
公共类UserDTO
{
public int UserId{get;set;}
公共字符串名称{get;set;}
公共日期时间CreateDate{get;set;}
公共虚拟电话号码电话号码{get;set;}
公共虚拟字符串TwitterHandel{get;set;}
公共虚拟映像映像{get;set;}
}
这里是一个点跟踪屏幕截图,显示Automapper需要多长时间,不确定它提供了多少洞察力,我昨天刚刚安装了dotrace来解决这个问题。
简而言之,正在进行数据库调用

AutoMapper正在调用关系属性getter,它使用EntityFramework从数据库加载数据


快速修复方法是禁用延迟加载的集合。

您的
消息
类是实体框架模型的一部分,您似乎启用了延迟加载。因此,当从该
Message
类映射时,属性
MediaMessages
ReadReceipts
尚未从数据库加载,AutoMapper会触发延迟加载。因此,这4秒钟实际上是映射过程中发生的两个数据库调用


在映射实体之前,您应该急切地加载它们。禁用延迟加载并在查询过程中手动
.Include()
它们可能是一个更好的主意。

我认为这一行导致了问题。FormMember(dest=>dest.ConversationUsers,opt=>opt.MapFrom(src=>src.ConversationUsers));