【问题标题】:how to map multiple OBJECTS to one object using AutoMapper - asp.net mvc 3如何使用 AutoMapper 将多个对象映射到一个对象 - asp.net mvc 3
【发布时间】:2011-09-28 08:31:03
【问题描述】:

大家好 / Auto-Mapper 的新手。我可以一对一映射对象,但想知道是否可以将多个对象映射到一个对象或将多个对象映射到多个对象?

考虑我有以下情况......

用户模型

public class User
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public Company Company { get; set; }  // 1 user work in 1 company
    }

公司模式

public class Company
        {
            public string CompanyName { get; set; }
            public string Website { get; set; }
            public ICollection<User> Users { get; set; }  // 1 Company can have many users
        }

用户公司视图模型

我想在一个视图中显示用户列表及其公司详细信息..

public class UserCompanyViewModel
            {
                 public ICollection<User> Users { get; set; }
                 ppublic ICollection<Company> Companies { get; set; }   
            }

现在,是否可以在这种情况下进行映射,如果可以,我可以在一个视图中显示,并且在编辑该视图时,我想再次将更新的字段映射回各自的模型。

任何帮助将不胜感激...谢谢

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 automapper


    【解决方案1】:

    在这种情况下,您是否真的使用多个(类型)对象作为源?从您定义的问题看来,您的来源是用户列表 - 从“我想显示用户列表及其公司详细信息”来判断。

    如果是这种情况,虽然您不能隐式执行此操作,但您可以使用 TypeConverter 轻松地执行映射:

    Mapper.CreateMap<ICollection<User>, UserCompanyViewModel>()
          .ConvertUsing<UserCompanyViewModelConverter>();
    

    然后将您的转换器定义为:

    public class UserCompanyViewModelConverter : ITypeConverter<ICollection<User>, UserCompanyViewModel>
    {
        public UserCompanyViewModel Convert(ResolutionContext context)
        {
            UserCompanyViewModel model = new UserCompanyViewModel();
    
            ICollection<User> sourceUsers = (ICollection<User>)context.SourceValue;
    
            model.Users     = sourceUsers;
            model.Companies = sourceUsers.Select(u => u.Company).Distinct().ToList();
    
            return model;
        }
    }
    

    然后,当您想要映射时,只需将您的用户集合 someUsers 并映射它:

    UserCompanyViewModel model = Mapper.Map<ICollection<User>, UserCompanyViewModel>(someUsers);
    

    如果您确实需要将多个源类型映射到单个目标类型,看起来this blog post 包含一个可以帮助您的简短 Helper 类。简而言之,AutoMapper 并不完全支持这一点,因此您将发出几个 Map 请求来填充您的 ViewModel。您需要使用另一个 TypeConverter 来确保第二个调用不会替换第一个调用添加的 Companies。

    【讨论】:

    • 正如我所说,在一个视图中,我想向用户展示公司详细信息的集合。所以会有 2 个集合用户,公司,所以我有 UserCompanyViewModel 来显示。
    • ViewModel 是目的地。您的源集合,您从商店中检索然后放入 ViewModel 的数据,对吗?
    • 是的。在这种情况下,我的来源是用户集合和公司集合。想要将所有内容放在目标 UserCompanyVM 中,然后为每个用户显示公司详细信息..
    • 我正在尝试相同的示例并得到此异常..|缺少类型映射配置或不受支持的映射。|
    • 确保 CreateMap 被调用?我几乎逐字复制了这个例子,只是省略了我使用的测试数据。我已经更新了答案以包含一个可能对您有进一步帮助的链接。
    【解决方案2】:

    你可以使用模型映射器

    @Autowired
    private ModelMapper modelMapper;
    

    在函数中

    Desination desination = modelMapper.map(obj1, Desination.class);
    modelMapper.map(obj2, desination);
    

    【讨论】:

      猜你喜欢
      • 2021-04-28
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多