как сопоставить несколько объектов с одним объектом с помощью AutoMapper - asp.net mvc 3

Привет всем / очень новый для 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

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);

Если вам действительно нужно сопоставить несколько типов источников в один тип адресата, это выглядит как этот блог включает в себя короткий вспомогательный класс, который поможет вам. Короче говоря, AutoMapper не совсем поддерживает это, поэтому вы сделаете пару запросов на карту, чтобы заполнить свою ViewModel. Вам нужно будет использовать другой TypeConverter чтобы убедиться, что второй вызов не заменяет компании, добавленные первый.