gpt4 book ai didi

asp.net - 如何使用 AutoMapper 将多个对象映射到一个对象 - asp.net mvc 3

转载 作者:行者123 更新时间:2023-12-02 09:02:42 25 4
gpt4 key购买 nike

大家好/对自动映射器非常陌生。我可以一对一对象映射,但想知道是否可以将多个对象映射到一个对象或将多个对象映射到多个对象?

考虑我有以下场景...

用户模型

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

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

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

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

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

最佳答案

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

如果是这种情况,虽然您无法隐式执行此操作,但您可以使用 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 来确保第二次调用不会替换第一次添加的公司。

关于asp.net - 如何使用 AutoMapper 将多个对象映射到一个对象 - asp.net mvc 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7580392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com