列表场景的AutoMapper似乎只重复映射列表中的第一个对象

本文关键字:列表 一个对象 映射 AutoMapper | 更新日期: 2023-09-27 18:19:33

我正在开发一个MVC 3应用程序,并使用AutoMapper在ViewModels和实体之间移动数据。我有一个场景,需要在两个列表之间移动数据。出于某种奇怪的原因,AutoMapper似乎只从源对象复制第一个对象,然后似乎将同一对象复制n次到目标列表。例如,假设您有2个列表,源包含6个实体项,目标包含0个项,因为它刚刚被实例化。位置source[0]处的项被复制到目标,然后对于源列表中相同数量的项重复复制source[0],在本例中为6。我不明白这可能是什么原因。

这是AutoMapper配置文件:

public static class AutoMapperConfigurator
{
    public static void Configure()
    {
        Mapper.CreateMap<User, UserModel>();
        Mapper.CreateMap<Posting, PostingModel>();
    }
}

这是Global.asax文件设置

protected void Application_Start()
{
    AutoMapperConfigurator.Configure();
}

这是我调用地图方法的位置

userSearchModel.UserList = Mapper.Map<IList<User>, IList<UserModel>>(userEntities);

列表场景的AutoMapper似乎只重复映射列表中的第一个对象

因此,这是一个合适的解决方案,但不是我们在使用AutoMapper时所希望的。

当您错误地重写要映射的实体/模型的Equals方法时,此问题很常见。

例如,如果您尝试映射上面的对象列表,您将仅从SourceEntity中获得第一个对象。

    public class SourceEntity 
    {
         public string MyField {get; set;}         
         public override bool Equals(object obj)
         {
              return true;
         }
    }
    public class TargetEntity 
    {
          public string MyField {get; set;}  
    }

检查Equals方法是否返回true。

对于其他有这个问题的人来说,文档似乎对我不起作用。一位同事提出了以下建议:

userSearchModel.UserList = UserEvent.Select(item => Mapper.Map<User, UserListModel>(item));

它就像一个符咒。