嗨全部/非常新的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 }
UserCompanyviewmodel
public class UserCompanyviewmodel { public ICollection<User> Users { get; set; } ppublic ICollection<Company> Companies { get; set; } }
现在,是否可以在这种情况下进行映射,如果是,我可以在一个视图中显示,在编辑该视图时,我想再次使用更新的字段映射回各自的模型.
任何帮助将不胜感激…… thx
解决方法
在这种情况下,您真的使用多种(类型)对象作为源吗?从您定义的问题看,您的来源是用户列表 – 通过“我想显示用户列表及其公司详细信息”来判断.
如果是这种情况,虽然您不能隐式地执行此操作,但您可以使用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; } }
然后,当您想要映射时,只需将您的用户集合用于某些用户并映射它:
UserCompanyviewmodel model = Mapper.Map<ICollection<User>,UserCompanyviewmodel>(someUsers);
如果您确实需要将多个源类型映射到单个目标类型,则看起来this blog post包含一个可以帮助您的简短助手类.简而言之,AutoMapper并不完全支持这一点,因此您将制作几个Map请求来填充viewmodel.您将需要使用另一个TypeConverter来确保第二个调用不会替换第一个调用添加的公司.