如何使用AutoMapper将多个OBJECTS映射到一个对象 - asp.net mvc 3
问题描述:
大家好/很新的Auto-Mapper。我可以映射一对一的对象,但想知道是否可以将多个对象映射到一个对象或将多个对象映射到多个对象?如何使用AutoMapper将多个OBJECTS映射到一个对象 - asp.net mvc 3
认为我有以下情形......
用户模型
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;
}
}
然后当你想映射你只需拿你的用户集合someUsers
并映射它:
UserCompanyViewModel model = Mapper.Map<ICollection<User>, UserCompanyViewModel>(someUsers);
如果您确实需要将多个源类型映射到单个目标类型,它看起来像this blog post包含一个简短的帮助程序类,它可以帮助您。简而言之,AutoMapper并不完全支持这一点,所以你将会发出一些Map请求来填充你的ViewModel。您将需要使用另一个TypeConverter
以确保第二个电话不会替换第一个电话添加的公司。
正如我所说,在一个视图中,我想显示一个用户与公司的详细信息的集合。所以会有2个集合用户,公司,所以我有UserCompanyViewModel来显示。 –
然而,ViewModel是目的地。您的源代码收集,您从商店中检索然后放入ViewModel中的数据,对不对? – Kasaku
是的..在这种情况下,我的来源是用户和公司合并的集合。想要把所有在目标UserCompanyVM,然后显示foreach用户与公司的详细信息.. –